2015-11-02 75 views
4

假設echo $PATH得到/first/dir:/second/dir:/third/dir

問:一個人如何在時代迴響$PATH一個目錄的內容,如:

``` 
$ newcommand $PATH 
/first/dir 
/second/dir 
/third/dir 
``` 

最好,我試圖找出如何做到這一點有for環路問題每個$PATH中的目錄實例爲echo的一個實例。

回答

0

您可以使用tr(translate)用換行符(\n)替換冒號(:),然後在for循環中迭代該冒號。

directories=$(echo $PATH | tr ":" "\n") 
for directory in $directories 
do 
    echo $directory 
done 
+0

根本沒有理由重複您已經換行的分隔輸出。這對於其中包含空格(或全局字符)的路徑條目不起作用。 –

+0

@EtanReisner專門提問的問題 – doublesharp

+0

夠公平的,我掩飾了這個偏好。儘管如此,這對空間或球體仍然不安全,並且意味着轉換爲空格或'NUL'可能會更好,然後解析(肯定是'while')循環。 –

2

如何:

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不寫一個換行符,否則我們會以空行結束。

+1

引用您的變量擴展。 '「$ PATH」' –

+0

問題要求在for循環中使用 – doublesharp

5
echo "$PATH" | tr ':' '\n' 

應該這樣做。這將只需要輸出echo "$PATH"並用換行符分隔符替換任何冒號。

請注意,$PATH左右的引號可防止輸出$PATH中的多個連續空格崩潰,同時仍然輸出變量的內容。

+1

引用您的變量擴展。 '「$ PATH」' –

+0

問題要求在for循環中使用 – doublesharp

+1

@doublesharp他說最好。我提供的解決方案不僅僅是爲了滿足他的需求,而且還考慮了Google/SO中的其他人的搜索。 – CydrickT

1

我的想法是使用echoawk

echo $PATH | awk 'BEGIN {FS=":"} {for (i=0; i<=NF; i++) print $i}' 

編輯

這個命令是不是我以前的想法更好。

echo "$PATH" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}' 
+0

引用您的變量擴展。 ''$ PATH'' –

+1

設置'OFS =「\ n」',awk會爲你換行。 (在你說服它之後,你已經修改了類似'$ 1 = $ 1'的行) –

1

作爲附加選項(並且如果你需要的條目用於其他目的數組),您可以用自定義IFSread -a做到這一點:

IFS=: read -r -a patharr <<<"$PATH" 
printf %s\\n "${patharr[@]}" 

或者自提要求對於具有一個版本的循環:

for dir in "${patharr[@]}"; do 
    echo "$dir" 
done 
+1

array + for循環是適用於* all *合法PATH值的唯一方法(包括那些目錄名包含換行符字符)。 (這是'PATH'的限制,即包含':'的目錄名稱,雖然合法,但不能安全地添加到PATH中)。 – chepner

0

如果你能保證路徑不包含空格,您可以:

for dir in ${PATH//:/ }; do 
    echo $dir 
done 

如果有嵌入空格,這將會失敗。

+0

這也失敗與殼球。 'P = 'A:/ bin中/ *:B'; echo $ {P //:/}' –

相關問題