我試圖在shell中使用for
來用空格遍歷文件名。我在stackoverflow question中讀到IFS=$'\n'
可以使用,似乎工作正常。然後我讀了in a comment to one of the answers,爲了讓它可以和bash以外的shell兼容,可以使用IFS=$(echo -e '\n')
。
前者有效,後者則不。評論多次提高。我檢查了輸出和變量似乎並不包含換行符。
#!/bin/sh
IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
echo
IFS=$'\n'
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
輸出顯示字段分隔符缺少第一:
0000000
Found one
two two
three
但是在第二合適的:
0000000 0a
0000001
Found one
Found two two
Found three
我發現了一個問題,回答可能會或可能不會是我的問題的重複:
linux - When setting IFS to split on newlines, why is it necessary to include a backspace? - Stack Overflow
有沒有做什麼的存在,IFS=$(echo -en '\n\b')
討論什麼危險?因爲這增加了一個\b
IFS(我檢查)。 \b
可以在文件名中出現嗎?我不想讓我的代碼錯誤地分割文件名。
你也有任何建議如何正確處理for
循環後恢復IFS?我應該將它存儲在一個臨時變量中,還是在子shell中運行IFS和for語句? (如何做到這一點?)謝謝
謝謝你的信息我會記住這一點 – user2672807
請刪除您的第二個例子,因爲它是不乾淨: 'IFS = 「$(printf的 '\ n +')」' '$回聲 - n「$ IFS」| xxd' '00000000:0a2b' < - 這也給IFS增加了'+'。 –
@TomHale我刪除了不需要的+ –