Shell-Script

Posix shell 腳本 - 將多行命令輸出保存到變數

  • January 18, 2018

當我將包含多行變數的命令輸出直接保存到終端中時,我得到以下結果:

$ dirs=$(ls -1d /mnt/*/)
$ echo $dirs
/mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/
$ echo "$dirs"
/mnt/ext4/
/mnt/local/
/mnt/remote/
/mnt/test/

但是,當從 posix shell 腳本中使用它時,結果是不同的。這是腳本

#!/bin/sh

dirs=$(ls -1d $1)
echo "inline"
echo $dirs
echo "multiline"
echo "$dirs"

這是腳本輸出

$ ./test.sh /mnt/*/
inline
/mnt/ext4/
multiline
/mnt/ext4/

即使我使用 bash 而不是 sh,也會發生這種情況。

有誰知道我如何將輸出保存ls -1d /mnt/*/到保持完整輸出的變數中?

我想在 for 循環中解析四個目錄路徑中的每一個。

$ ./test.sh /mnt/*/

此處的 glob 將目錄名稱擴展為單獨的參數,就像您在命令行上手動寫出它們一樣:

$ ./test.sh /mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/

但是,在腳本本身中,您僅引用第一個參數$1

dirs=$(ls -1d $1)

如果要引用所有參數,請使用"$@"(帶引號)。

但是,您在這裡對目錄名稱所做的ls只是在它們上執行,它只會列印出相同的名稱(儘管在不同的行上)。因此,如果您只想將參數列表作為字元串,則根本不需要執行ls命令,只需 assign dirs="$@"

然而,在大多數情況下,如果不是所有情況,最好將文件名列表保留在位置參數中,然後使用

for f in "$@"; do ...

或者

for f
do ...

請注意,文件名可能包含空格,當您將名稱連接到單個字元串時,您會失去名稱中空格的含義。foo bar doo可能是三個文件,或者兩個文件foo bardoo.

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