Bash
替換字元串的單引號除以變數中的空格
我正在編寫一個 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 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
。由於沒有引用擴展,因此此時字元串會進行分詞,預設情況下會在空格處進行分詞。但是,在那之後,這些詞也被視為文件名 glob 並擴展為匹配的文件名。只要您的文件名不包含空格或全域字元 (
*?[]
,這很好。但總的來說,這不是您想要做的事情。對於正確的數組,您可能總是想使用
"${array[@]}"
而不是[*]
.