[英]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
-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 -f
或set +f
設置 IFS
oldifs
IFS=$'\\n'
以換行符分割(多個換行符將被視為一個) set -f
避免glob擴展,例如在行包含單個*
情況下 $()
()
周圍的note ()
存儲拆分結果到數組 嘗試這樣的事情:
#!/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.