Shell-Script
Posix shell 腳本 - 將多行命令輸出保存到變數
當我將包含多行變數的命令輸出直接保存到終端中時,我得到以下結果:
$ 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
命令,只需 assigndirs="$@"
。然而,在大多數情況下,如果不是所有情況,最好將文件名列表保留在位置參數中,然後使用
for f in "$@"; do ...
或者
for f do ...
請注意,文件名可能包含空格,當您將名稱連接到單個字元串時,您會失去名稱中空格的含義。
foo bar doo
可能是三個文件,或者兩個文件foo bar
和doo
.