
read
我正在編寫一個 bash 腳本,透過這兩個字串讀取變數:
log.*.console.log log.*.log
它們被空間隔開。
如何重寫腳本中呼叫的下一個程式的變數輸出將採用這種形式的字串?'log.*.console.log' 'log.*.log'
我正在嘗試 sed 和 awk 但不知何故沒有成功。
整個腳本:
#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1
else
echo "some text"
read varlogname
i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")
for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0
答案1
我認為您不想給 加上單引號gtar
。在諸如 之類的命令中somecmd 'foo bar' 'files*.log'
,shell 將處理引號,它們告訴它不要特殊對待特殊字符,並傳遞somecmd
參數foo bar
和files*.log
。 Unix 程式不會將命令列作為一個字串獲取,而是將多個參數字串獲取,是 shell 將命令列分割為字串。
如果你想read
在 Bash 中使用多個值,你可以使用read -a array
,然後將陣列傳遞給指令。
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
IE
read -a filenames
gtar "${filenames[@]}"
使用(在引號中)索引數組[@]
會擴展為數組成員作為單獨的單詞,這就是您想要的。
另外,你有for file in ${GTAR[*]}
.這看起來像是GTAR
作為一個數組進行訪問,但它不是一個數組,您只是將命令的輸出gtar
作為字串分配給它。在這種情況下${GTAR[*]}
與 相同$GTAR
。由於擴展沒有被引用,字串此時會進行分詞,預設會在空格上進行分割。但是,在那之後,這句話是也被視為檔案名稱全域並擴展為符合的檔案名稱。
只要您的檔案名稱不包含空格或通配符 ( *?[]
,就可以了。但一般來說,這不是您想要做的事情。
對於正確的數組,您可能總是想使用"${array[@]}"
而不是[*]
.