Shell

你能幫我解釋一下這個 bash 程式碼中的這三件事嗎?

  • March 9, 2019

function我的文件中有一個.bashrc。我知道它的作用,它增加了 X 多個目錄cd

這裡是:

up()
{
   local d=""
   limit=$1
   for ((i=1 ; i <= limit ; i++))
     do
       d=$d/..
     done
   d=$(echo $d | sed 's/^\///')
   if [ -z "$d" ]; then
     d=..
   fi
   cd $d
}

但是你能幫我解釋一下這三件事嗎?

  1. d=$d/..
  2. sed 's/^\///'
  3. d=..

為什麼不這樣做:

up()
{
   limit=$1

   for ((i=1 ; i <= limit ; i++))
   do
       cd ..
   done
}

用法:

<<<>>>~$ up 3
<<<>>>/$
  1. d=$d/..添加/..d變數的目前內容。d開始是空的,然後第一次迭代成功/..,第二次/../..等等。
  2. sed 's/^\///'刪除第一個/,因此/../..變為 ../..(這可以使用參數擴展來完成,d=${d#/})。
  3. d=..僅在其條件的上下文中才有意義:
if [ -z "$d" ]; then
 d=..
fi

這樣可以確保,如果d此時為空,則轉到父目錄。(up沒有參數等同於cd ..。)

這種方法比迭代更好,cd ..因為它保留cd -了一步返回上一個目錄的能力(從使用者的角度來看)。

函式可以簡化:

up() {
 local d=..
 for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
 cd $d
}

這假設我們至少要向上移動一級,並添加n - 1級,因此我們不需要刪除前導/或檢查空的$d.

使用 Athena jotathena-jotDebian 中的軟體包):

up() { cd $(jot -b .. -s / "${1:-1}"); }

(基於glenn jackman建議的變體)。

引用自:https://unix.stackexchange.com/questions/476253