假設echo $PATH
得到/first/dir:/second/dir:/third/dir
。
問:一個人如何在時代迴響$PATH
一個目錄的內容,如:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
最好,我試圖找出如何做到這一點有for
環路問題每個$PATH
中的目錄實例爲echo
的一個實例。
假設echo $PATH
得到/first/dir:/second/dir:/third/dir
。
問:一個人如何在時代迴響$PATH
一個目錄的內容,如:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
最好,我試圖找出如何做到這一點有for
環路問題每個$PATH
中的目錄實例爲echo
的一個實例。
您可以使用tr
(translate)用換行符(\n
)替換冒號(:
),然後在for循環中迭代該冒號。
directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
echo $directory
done
如何:
echo "$PATH" | sed -e 's/:/\n/g'
(見sed's s
command; sed -e 'y/:/\n/'
也將工作,相當於tr ":" "\n"
一些其他的答案。)
這是最好不要的東西,除非複雜絕對必要:這裏不需要for循環。還有其他的方法來對列表中的每個條目執行一個命令,更符合Unix Philosophy行:
這是Unix哲學:編寫做一兩件事並把它做好計劃。編寫程序一起工作。編寫程序來處理文本流,因爲這是一個通用接口。
如:
echo "$PATH" | sed -e 's/:/\n/g' | xargs -n 1 echo
這在功能上等同於一個for循環遍歷路徑元件,執行該最後echo
命令爲每個元素。 -n 1
告訴xargs
只提供1個參數給它的命令;沒有它,我們會得到與echo "$PATH" | sed -e 'y/:/ /'
相同的輸出。
由於這種使用xargs
,已經內置支持拆分輸入,如果沒有給命令相呼應的輸入,我們可以寫爲:
echo -n "$PATH" | xargs -d ':' -n 1
的-d ':'
告訴xargs的使用:
分離它是輸入而不是換行符,並且-n
告訴/bin/echo
不寫一個換行符,否則我們會以空行結束。
引用您的變量擴展。 '「$ PATH」' –
問題要求在for循環中使用 – doublesharp
echo "$PATH" | tr ':' '\n'
應該這樣做。這將只需要輸出echo "$PATH"
並用換行符分隔符替換任何冒號。
請注意,$PATH
左右的引號可防止輸出$PATH
中的多個連續空格崩潰,同時仍然輸出變量的內容。
引用您的變量擴展。 '「$ PATH」' –
問題要求在for循環中使用 – doublesharp
@doublesharp他說最好。我提供的解決方案不僅僅是爲了滿足他的需求,而且還考慮了Google/SO中的其他人的搜索。 – CydrickT
我的想法是使用echo
和awk
。
echo $PATH | awk 'BEGIN {FS=":"} {for (i=0; i<=NF; i++) print $i}'
編輯
這個命令是不是我以前的想法更好。
echo "$PATH" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}'
引用您的變量擴展。 ''$ PATH'' –
設置'OFS =「\ n」',awk會爲你換行。 (在你說服它之後,你已經修改了類似'$ 1 = $ 1'的行) –
作爲附加選項(並且如果你需要的條目用於其他目的數組),您可以用自定義IFS
和read -a
做到這一點:
IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"
或者自提要求對於具有一個版本的循環:
for dir in "${patharr[@]}"; do
echo "$dir"
done
array + for循環是適用於* all *合法PATH值的唯一方法(包括那些目錄名包含換行符字符)。 (這是'PATH'的限制,即包含':'的目錄名稱,雖然合法,但不能安全地添加到PATH中)。 – chepner
如果你能保證路徑不包含空格,您可以:
for dir in ${PATH//:/ }; do
echo $dir
done
如果有嵌入空格,這將會失敗。
這也失敗與殼球。 'P = 'A:/ bin中/ *:B'; echo $ {P //:/}' –
根本沒有理由重複您已經換行的分隔輸出。這對於其中包含空格(或全局字符)的路徑條目不起作用。 –
@EtanReisner專門提問的問題 – doublesharp
夠公平的,我掩飾了這個偏好。儘管如此,這對空間或球體仍然不安全,並且意味着轉換爲空格或'NUL'可能會更好,然後解析(肯定是'while')循環。 –