簡體   English   中英

Shell腳本:函數中的變量作用域

[英]Shell script: variable scope in functions

我編寫了一個快速的Shell腳本來模擬xkcd#981的情況(沒有硬鏈接,只是到父目錄的符號鏈接),並使用了遞歸函數來創建所有目錄。 不幸的是,該腳本無法提供理想的結果,因此我認為我對變量$ count的范圍的理解是錯誤的。

我如何正確地使函數使用遞歸來創建二十個級別的文件夾,每個級別包含3個文件夾(3 ^ 20個文件夾,以軟鏈接結尾回到頂部)?

#!/bin/bash
echo "Generating folders:"
toplevel=$PWD
count=1
GEN_DIRS() {
for i in 1 2 3
do
        dirname=$RANDOM
        mkdir $dirname
        cd $dirname
        count=$(expr $count + 1)
        if [ $count < 20 ] ; then
                GEN_DIRS
        else
                ln -s $toplevel "./$dirname"
        fi
done
}
GEN_DIRS
exit

試試這個(腳本的修訂版)-似乎對我有用。 我拒絕測試到20個深度。 在8個層級的深度下,三個頂層目錄中的每個目錄在Mac文件系統上都占用約50 MB的空間。

#!/bin/bash
echo "Generating folders:"
toplevel=$PWD
GEN_DIRS()
{
    cur=${1:?}
    max=${2:?}
    for i in 1 2 3
    do
        dirname=$RANDOM
        if [ $cur -le $max ]
        then
            (
            echo "Directory: $PWD/$dirname"
            mkdir $dirname
            cd $dirname
            GEN_DIRS $((cur+1)) $max
            )
        else
            echo "Symlink:   $PWD/$dirname"
            ln -s $toplevel "./$dirname"
        fi
    done
}

GEN_DIRS 1 ${1:-4}

第6行和第7行為傳遞給函數的位置參數( $1$2 )起了名字- ${1:?}表示法只是意味着,如果忽略傳遞參數$1 ,則會從shell收到錯誤消息(或子外殼),然后退出。

括號本身(上面的第13和18行)意味着它們之間的命令在子shell中運行,因此子shell中目錄的更改不會影響父shell。

現在,第11行的條件使用算術( -le )而不是字符串<比較; 這對於深度嵌套更有效(因為<是字典比較,所以9級不小於10級)。 這也意味着可以使用[命令而不是[[命令(盡管[[也可以,但是我更喜歡老式的表示法))。

我最終創建了這樣的腳本:

#!/bin/bash

echo "Generating folders:"

toplevel=$PWD

level=0
maxlevel=4

function generate_dirs {
    pushd "$1" >/dev/null || return
    (( ++level ))
    for i in 1 2 3; do
        dirname=$RANDOM
        if (( level < maxlevel )); then
            echo "$PWD/$dirname"
            mkdir "$dirname" && generate_dirs "$dirname"
        else
            echo "$PWD/$dirname (link to top)"
            ln -sf "$toplevel" "$dirname"
        fi
    done
    popd >/dev/null 
    (( --level ))
}

generate_dirs .

exit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM