2017-05-15 34 views
-1
#! /bin/bash 
for i in $(ls); 
do 
    j=1 
    echo "$i" 

沒有預期的輸出: -我們如何可以增加內的一個字符串變量循環

autodeploy 
bin 
config 
console-ext 
edit.lok 

需要像下面的輸出,如果給輸入2它應該打印以下條件基礎上的「bin」,但我想出來讓像目錄列表

1.)autodeploy 
2.)bin 
3.)config 
4.)console-ext 
5.)edit.lok 

,如果我喜歡作爲輸入: - 2那麼它應該打印"bin"

+5

切勿使用'爲我在$(ls)....'見[** BashPitfalls - 格雷格的維基**](http://mywiki.wooledge.org/BashPitfalls)。 –

+0

非常感謝大衛:) – banarasi

回答

3

BashFAQ #1,一個while read環就是閱讀內容逐條線的正確方法:

#!/usr/bin/env bash 

enumerate() { 
    local line i 
    i=0 
    while IFS= read -r line; do 
    ((++i)) 
    printf '%d.) %s\n' "$i" "$line" 
    done 
} 

ls | enumerate 

然而,ls對程序使用適當的工具;如果ls的結果僅用於人類消費,那麼以上是可以接受的,但是如果他們將要被機器解析,則不可以 - 請參閱Why you shouldn't parse the output of ls(1)


如果要列出的文件,並讓用戶通過號碼當中選擇,一個全局正則表達式的結果傳遞給select

select filename in *; do 
    echo "$filename" && break 
done 
+0

非常感謝非常:)我是腳本編寫新手,所以請你指導我讓用戶在其中選擇編號,通過glob表達式的結果來選擇:for this#!/ usr/bin/env bash enumerate(){ 本地行i i = 0 while IFS = read -r line;做 ((++ i))的 的printf '%d)%S \ n'。 「$ I」, 「$線」 做 } LS |枚舉 – banarasi

+0

Eh?後一種方法,''中的選擇文件名*',會傳遞「glob表達式的結果來選擇」東西。在這種情況下根本不需要'枚舉'功能。 –

+0

'ls |枚舉'將'ls'的輸出作爲輸入(參數列表)傳遞給定義在該行上方的函數'枚舉'。 –

0

我不明白你在的意思你通過如目錄列表,但以下的例子的問題,你不需要寫一個循環:

ls|nl -s '.)' -w 1 

如果你想避免個LS,你可以做以下(但要小心 - 這隻能如果目錄條目不包含空格(因爲這樣會使FMT將它們分解成兩行):

echo *|fmt -w 1 |nl -s '.)' -w 1 
相關問題