shell中 `` 與()問題請教 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


shell中 `` 與()問題請教
會員二級
註冊日期:
2015/11/16 9:07
所屬群組:
已註冊使用者
等級: 6
HP : 0 / 137
MP : 19 / 3030
EXP: 48
離線
您好:
請問在以下範例中,
1.
sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug') 他是 陣列初始化嗎?
我試著直接用 echo ${sanple1
  • }
  • 沒有資料跑出來

    2.
    sample2=(`echo "${sample1
  • }" | sort`) #作排序並顯示 ,
  • 一定要用(``)來做嗎 ?
    他是指先`` 執行後,再() 執行一次嗎?


    ----------------------------
    #!/bin/bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n' #利用單引號作區隔

    sample2=(`echo "${sample1
  • }" | sort`) #作排序並顯示 ,
  • echo "${sample2
  • }" #顯示上行所顯示的內容
  • echo "${sample2[3]}" #顯示排序第三位

    2016/3/25 17:09
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結


    ================================================

    wayout 寫到:
    您好:
    請問在以下範例中,
    1.
    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug') 他是 陣列初始化嗎?
    我試著直接用 echo ${sanple1[ * ]}
    沒有資料跑出來

    2.
    sample2=(`echo "${sample1[ * ]}" | sort`) #作排序並顯示 ,
    一定要用(``)來做嗎 ?
    他是指先`` 執行後,再() 執行一次嗎?


    ----------------------------
    #!/bin/bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n' #利用單引號作區隔

    sample2=(`echo "${sample1[ * ]}" | sort`) #作排序並顯示 ,
    echo "${sample2[ * ]}" #顯示上行所顯示的內容
    echo "${sample2[3]}" #顯示排序第三位






    先跳脫「Array」的用法,我們先來談「String」的用法,以下我會分好幾個回覆。


    ## 範例一


    #!/usr/bin/env bash

    LIST='Jan Feb Mar Apr Jun Jul Aug'

    echo $LIST;





    ## 範例二



    #!/usr/bin/env bash

    LIST="Jan Feb Mar Apr Jun Jul Aug"

    echo $LIST;




    上面兩個範例說明,「單引號(')」和「雙引號(")」,都是「字串(String)」,
    至於有啥差別,就不在這裡討論,先聚焦在你想要使用的功能上面。

    「範例一」和「範例二」都是顯示


    Jan Feb Mar Apr Jun Jul Aug




    ## 範例三


    #!/usr/bin/env bash

    LIST='Jan Feb Mar Apr Jun Jul Aug'

    for ITEM in $LIST; do
    echo $ITEM
    done




    ## 範例四


    #!/usr/bin/env bash

    LIST="Jan Feb Mar Apr Jun Jul Aug"

    for ITEM in $LIST; do
    echo $ITEM
    done



    上面兩個範例說明,你可以用for來跑迴圈,會將字串根據空白拆解。

    所以「範例三」和「範例四」會顯示


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug


    2016/3/26 3:46
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結



    =================================================


    延續上一個回覆的「String」用法,我們可以把「檔案內容」叫出來存成「字串」來「跑迴圈」。

    先準備一個檔案,命名叫「one_line.txt」,內容如下,只有單純的一行


    Jan Feb Mar Apr Jun Jul Aug





    ## 範例一


    #!/usr/bin/env bash

    cat one_line.txt




    ## 範例二


    #!/usr/bin/env bash

    echo $(cat one_line.txt)




    ## 範例三


    #!/usr/bin/env bash

    LIST=$(cat one_line.txt)

    echo $LIST




    ## 範例四


    #!/usr/bin/env bash

    LIST=$(cat one_line.txt)

    for ITEM in $LIST; do
    echo $ITEM
    done




    ## 範例五


    #!/usr/bin/env bash

    for ITEM in $(cat one_line.txt); do
    echo $ITEM
    done


    2016/3/26 3:49
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    ====================================================

    這個回覆的範例,跟上面一個回覆的所有範例結果是一樣的,可以對照。

    只是將「$()」改成「``」而已。

    還記得之前的「討論」,
    有提到


    更多請參考「man bash」,找尋「Command Substitution」

    ...略...

    Command Substitution
    Command substitution allows the output of a command to replace the
    command name. There are two forms:

    $(command)
    or
    `command`

    ...略...





    先準備一個檔,命名叫「one_line.txt」,內容如下,只有單純的一行


    Jan Feb Mar Apr Jun Jul Aug





    ## 範例一


    #!/usr/bin/env bash

    cat one_line.txt




    ## 範例二


    #!/usr/bin/env bash

    echo `cat one_line.txt`




    ## 範例三


    #!/usr/bin/env bash

    LIST=`cat one_line.txt`

    echo $LIST




    ## 範例四


    #!/usr/bin/env bash

    LIST=`cat one_line.txt`

    for ITEM in $LIST; do
    echo $ITEM
    done




    ## 範例五


    #!/usr/bin/env bash

    for ITEM in `cat one_line.txt`; do
    echo $ITEM
    done


    2016/3/26 3:52
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    ================================================

    上面兩個回覆的範例,檔案只有單純一行,這個回覆的範例改用多行的檔案。


    先準備一個檔,命名叫「list.txt」,內容如下,


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug





    ## 範例一


    #!/usr/bin/env bash

    cat list.txt




    ## 範例二

    注意:這個範例,結果是顯示一行

    請對照「範例六」顯示多行的寫法



    #!/usr/bin/env bash

    echo $(cat list.txt)




    ## 範例三


    #!/usr/bin/env bash

    LIST=$(cat list.txt)

    echo $LIST




    ## 範例四


    #!/usr/bin/env bash

    LIST=$(cat list.txt)

    for ITEM in $LIST; do
    echo $ITEM
    done




    ## 範例五


    #!/usr/bin/env bash

    for ITEM in $(cat list.txt); do
    echo $ITEM
    done




    ## 範例六

    請對照「範例二」,區分其中的差異。


    #!/usr/bin/env bash

    echo "$(cat list.txt)"


    2016/3/26 3:54
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    ============================================

    這個回覆的範例,跟上面一個回覆的所有範例結果是一樣的,可以對照。

    只是將「$()」改成「``」而已。



    先準備一個檔,命名叫「list.txt」,內容如下,一樣是多行的檔案


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug





    ## 範例一


    #!/usr/bin/env bash

    cat list.txt




    ## 範例二

    注意:這個範例,結果是顯示一行

    請對照「範例六」顯示多行的寫法



    #!/usr/bin/env bash

    echo `cat list.txt`




    ## 範例三


    #!/usr/bin/env bash

    LIST=`cat list.txt`

    echo $LIST




    ## 範例四


    #!/usr/bin/env bash

    LIST=`cat list.txt`

    for ITEM in $LIST; do
    echo $ITEM
    done




    ## 範例五


    #!/usr/bin/env bash

    for ITEM in `cat list.txt`; do
    echo $ITEM
    done




    ## 範例六

    請對照「範例二」,區分其中的差異。


    #!/usr/bin/env bash

    echo "`cat list.txt`"


    2016/3/26 3:57
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    =============================================

    接下來要談「sort」,不過要談「sort」之前,先來看幾個「printf」的範例

    ## 範例一


    #!/usr/bin/env bash

    printf "%s\n" 'Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug'




    ## 範例二


    #!/usr/bin/env bash

    LIST='Jan Feb Mar Apr Jun Jul Aug'

    printf "%s\n" $LIST



    上面兩個範例都會顯示多行


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug





    ## 範例三


    #!/usr/bin/env bash

    printf "%s\n" 'Jan Feb Mar Apr Jun Jul Aug'



    這裡只有顯示一行


    Jan Feb Mar Apr Jun Jul Aug


    2016/3/26 4:01
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    ==============================================

    真的要來談sort了,

    請先執行「$ man sort」,

    可以找到下面的文字



    ...略...

    NAME

    sort - sort lines of text files

    ...略...



    這裡討論要注意的是「sort lines」。

    先準備剛剛有使用過的兩個檔案

    一個檔,命名叫「one_line.txt」,內容如下,只有單純的一行


    Jan Feb Mar Apr Jun Jul Aug



    另一個檔,命名叫「list.txt」,內容如下,


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug



    接下來看範例

    ## 範例一


    #!/usr/bin/env bash

    sort list.txt



    顯示


    Apr
    Aug
    Feb
    Jan
    Jul
    Jun
    Mar



    ## 範例二


    #!/usr/bin/env bash

    sort one_line.txt



    顯示


    Jan Feb Mar Apr Jun Jul Aug




    因為「one_line.txt」只有一行,還記得上面提到的「sort - sort lines of text files」。


    ## 範例三


    #!/usr/bin/env bash

    LIST='Jan Feb Mar Apr Jun Jul Aug'

    echo $LIST | sort




    顯示


    Jan Feb Mar Apr Jun Jul Aug



    這裡一樣顯示只有一行,同「範例二」。

    ## 範例四


    #!/usr/bin/env bash

    LIST='Jan Feb Mar Apr Jun Jul Aug'

    printf "%s\n" $LIST | sort



    顯示


    Apr
    Aug
    Feb
    Jan
    Jul
    Jun
    Mar




    還記得上一個回覆提到的「printf」的用法嗎?

    「範例四」將「範例三」改用「printf」,將「一行」轉成「多行」,再拋給「sort」去處理排序。

    注意:以上討論的用法,都還是在「String」的範疇喔,下面開始才是要討論「Array」。

    2016/3/26 4:08
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結

    =====================================


    接下回到你原本想要問的「Array」

    注意:
    下面的範例「[」,「*」,「]」,這兩兩間隔是沒有空白的,
    因為排版會跑掉,所以我加了空白,
    測試的時候,請將空白移除。

    ## 範例一


    #!/usr/bin/env bash

    LIST=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    echo ${LIST[ * ]}



    顯示


    Jan Feb Mar Apr Jun Jul Aug



    「${LIST[ * ]}」這個語法,就是列出陣列所有元素,不過echo出來會是只有一行。

    ## 範例二


    #!/usr/bin/env bash

    LIST=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    printf "%s\n" ${LIST[ * ]}



    顯示


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug



    透過「printf」轉成多行。

    ## 範例三


    #!/usr/bin/env bash

    LIST=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    printf "%s\n" ${LIST[ * ]} | sort




    顯示


    Apr
    Aug
    Feb
    Jan
    Jul
    Jun
    Mar



    一樣透過「printf」轉成多行,然後再丟給「sort」處理排序。



    ## 範例四


    #!/usr/bin/env bash

    LIST=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    echo ${LIST[0]}
    echo ${LIST[1]}
    echo ${LIST[2]}
    echo ${LIST[3]}



    存取每個元素的語法。

    以上回覆,應該可以建立一些基本的概念,幫助你了解一些疑惑,
    下面一個回覆,再來針對你的問題個別做解答。


    更多請參考「Bash Handbook / Arrays」。

    或是「$ man bash


    查尋「Arrays」,可以找到下面一段



    Arrays
    Bash provides one-dimensional indexed and associative array variables.
    Any variable may be used as an indexed array; the declare builtin will
    explicitly declare an array.

    ...以下省略,請使用 man bash,或點上面的連結,來看更多的內容...



    也可以查詢「printf」,可以看到下面一段


    printf [-v var] format [arguments]
    Write the formatted arguments to the standard output under the
    control of the format. The -v option causes the output to be
    assigned to the variable var rather than being printed to the
    standard output.

    ...以下省略,請使用 man bash,或點上面的連結,來看更多的內容...


    2016/3/26 4:16
    應用擴展 工具箱
    回覆: shell中 `` 與()問題請教
    會員五級
    註冊日期:
    2012/4/22 10:50
    所屬群組:
    已註冊使用者
    等級: 37
    HP : 0 / 901
    MP : 671 / 29331
    EXP: 6
    離線
    備份連結


    ==============================================================

    注意:
    下面的範例「[」,「*」,「]」,這兩兩間隔是沒有空白的,
    因為排版會跑掉,所以我加了空白,
    測試的時候,請將空白移除。


    ==============================================================

    wayout 寫到:
    您好:
    請問在以下範例中,
    1.
    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug') 他是 陣列初始化嗎?
    我試著直接用 echo ${sanple1[ * ]}
    沒有資料跑出來



    你上面的字拼錯了,「m」拼成「n」,
    也就是「sample1」拼成「sanple1」,兩個變數名稱不一致,所以沒有資料。

    改成下面的就可以了


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    echo ${sample1[ * ]}



    ==============================================================


    wayout 寫到:

    2.
    sample2=(`echo "${sample1[ * ]}" | sort`) #作排序並顯示 ,
    一定要用(``)來做嗎 ?
    他是指先`` 執行後,再() 執行一次嗎?


    ----------------------------
    #!/bin/bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n' #利用單引號作區隔

    sample2=(`echo "${sample1[ * ]}" | sort`) #作排序並顯示 ,
    echo "${sample2[ * ]}" #顯示上行所顯示的內容
    echo "${sample2[3]}" #顯示排序第三位




    依據你給的範例,拆解成下面的步驟,你就比較清楚了

    ## 範例一


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    echo ${sample1[ * ]}



    顯示


    Jan Feb Mar Apr Jun Jul Aug



    顯示一行,即使你有改「IFS」。

    ## 範例二


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    echo "${sample1[ * ]}"



    顯示多行


    Jan
    Feb
    Mar
    Apr
    Jun
    Jul
    Aug



    用「雙引號」把「${sample1[ * ]}」括起來,就會顯示多行了

    ## 範例三


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    echo "${sample1[ * ]}" | sort



    因為是多行,所以可以丟給「sort」處理排序。

    所以就顯示排序過後的結果


    Apr
    Aug
    Feb
    Jan
    Jul
    Jun
    Mar




    ## 範例四


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    sample2=`echo "${sample1[ * ]}" | sort` # 這時候 sample2 是「字串」不是「陣列」

    echo ${sample2[0]}



    顯示


    Apr Aug Feb Jan Jul Jun Mar




    ## 範例五


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    sample2=(`echo "${sample1[ * ]}" | sort`) # 多加了「()」,這時候 sample2 才是「陣列」

    echo ${sample2[0]}



    顯示


    Apr




    ==============================================================

    ## 範例六

    這個範例的邏輯跟「範例五」,是一樣的,只是「``」改成「$()」的寫法而已


    #!/usr/bin/env bash

    sample1=('Jan' 'Feb' 'Mar' 'Apr' 'Jun' 'Jul' 'Aug')

    IFS=$'\n'

    sample2=($(echo "${sample1[ * ]}" | sort))

    echo ${sample2[0]}



    顯示


    Apr


    2016/3/26 9:12
    應用擴展 工具箱

    (1) 2 »

     [無發表權] 請登錄或者註冊


    可以查看帖子.
    不可發帖.
    不可回覆.
    不可編輯自己的帖子.
    不可刪除自己的帖子.
    不可發起投票調查.
    不可在投票調查中投票.
    不可上傳附件.
    不可不經審核直接發帖.