Bash

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

  • April 10, 2017

我正在編寫一個 bash 腳本,我正在通過read這兩個字元串讀取一個變數:

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

我認為您不想給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。由於沒有引用擴展,因此此時字元串會進行分詞,預設情況下會在空格處進行分詞。但是,在那之後,這些詞被視為文件名 glob 並擴展為匹配的文件名。

只要您的文件名不包含空格或全域字元 ( *?[],這很好。但總的來說,這不是您想要做的事情。

對於正確的數組,您可能總是想使用"${array[@]}"而不是[*].

請參閱:分為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?數組

引用自:https://unix.stackexchange.com/questions/358062