替換變數中除以空格的字串的單引號

替換變數中除以空格的字串的單引號

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 barfiles*.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[@]}"而不是[*].

看:分詞,為什麼我的 shell 腳本會因為空格或其他特殊字元而卡住?陣列

相關內容