簡體   English   中英

命令行中的for循環運行bash腳本逐行從文本文件讀取

[英]For loop in command line runs bash script reading from text file line by line

我有一個bash腳本,要求兩個參數之間留有空格。 現在,我想通過從文本文件中讀取內容來自動在命令行中填寫提示。 文本文件包含帶有參數組合的列表。

我想在命令行中是這樣的;

for line in 'cat text.file' ; do script.sh ; done

能做到嗎? 我想念/做錯了什么?

謝謝您的幫助。

一個while循環可能是您需要的。 text.file空格分隔的字符串放在文件text.file

cat text.file
bingo yankee
bravo delta

然后像下面這樣編寫有問題的腳本。

#!/bin/bash
while read -r arg1 arg2
do
 /path/to/your/script.sh "$arg1" "$arg2"
done<text.file

'cat text.file'是字符串文字, $(cat text.file)會擴展為命令輸出,但是cat是無用的,因為bash可以使用重定向來讀取文件,並且帶有引號的情況下,它將被視為單個參數,並且不帶引號將在空格標簽和換行符處分開。

Bash語法逐行讀取文件,但是對於大文件將很慢

while IFS= read -r line; do ... "$line"; done < text.file
  • 取消為讀取命令設置IFS會保留前導空格
  • -r選項保留\\

讀取整個文件的另一種方法是content=$(<file) ,注意命令替換中的< 因此,一種新穎的方式來讀取文件到數組,每個元素都為非空行:

read_to_array () {
    local oldsetf=${-//[^f]} oldifs=$IFS
    set -f
    IFS=$'\n' array_content=($(<"$1")) IFS=$oldifs
    [[ $oldsetf ]]||set +f
}

read_to_array "file"
for element in "${array_content[@]}"; do ...; done
  • oldsetf用於存儲當前set -fset +f設置
  • 用於存儲當前IFS oldifs
  • IFS=$'\\n'以換行符分割(多個換行符將被視為一個)
  • set -f避免glob擴展,例如在行包含單個*情況下
  • $() ()周圍的note ()存儲拆分結果到數組

不要for逐行讀取文件

嘗試這樣的事情:

#!/bin/bash
ARGS= 
while IFS= read -r line; do
    ARGS="${ARGS} ${line}"
done < ./text.file

script.sh "$ARGS"

這會將每行添加到變量中,然后將其用作腳本的參數。

如果要創建一個由您所要求的文字確定的解決方案(使用for循環並解析文件中的行),我將使用由文件中的行數確定的迭代(如果它不是太大) 。

假設每行有兩個字符串,並用一個空格隔開(在腳本中用作位置參數:

file="$1"
f_count="$(wc -l < $file)"
for line in $(seq 1 $f_count)
do

    script.sh $(head -n $line $file | tail -n1) && wait

done

但是,使用sjsam的解決方案可能會有更好的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM