1

第一篇文章:)

几天来,一直在寻找和研究这个挑战的答案。我不知道我错过了什么。可能要靠近它才能看到:) 无论如何,继续挑战。下面是我的 .bashrc 文件的一小部分。我正在尝试做的是使用别名(书签 bmp)为我当前的路径添加书签(让这部分工作),然后像 ls 一样以列表形式调用所有书签(使用 lsbmp)。我会使用 pushd / popd 但我希望能够控制我使用的路径以及我使用它的顺序。

我先追求功能,然后再追求外观(正如您将在下面的代码中注意到的那样)。如果我尝试了不同的选项,您还会注意到几个注释掉的行(请原谅混乱)。我将输出粘贴在代码下方。输出的字符串“echo bmp1”是应该运行而不回显的。那是我被阻止了。

最后一件事,如果您可以提供任何建议以使其变得更好或添加其他选项,我也对此持开放态度。

提前感谢您提供或提供的任何帮助。

############################################
# bookmark section:
# list current bookmarked paths
function lsbmpvar {
  if [ -z "$bmpcounter" ]
  then
    bmpcounter=0
    bmp=""
    echo "bmpcounter is empty"
  else
    for bmpcount in $bmpcounter
    do
      bm="$"
      bm+="bmp"$bmpcount""
      bm1="echo "
      echo "${VAR1:="$bm1$bm"}"    # <--- printing out what I want to execute / run
      (( bmpcount++ ))
# commented out other items attempted below:
#    echo $bmpcounter
#      bm+="$("bmp"$bmpcount"")"
#      echo "$(bm)"
#      eval $bm
#      echo "$bm1$bm"
#      echo `$VAR1`
#      bbm=($(bm))
#      echo $bbm
#      echo "$bmp$bmpcount"
#      echo $(echo "bmp"$bmpcount"")
#      echo "$bmp"$bmpcount""
    done
  fi
}
alias lsbmp=lsbmpvar


# bookmark currrent path for later recall
function bookmarkpathvar {
  if [ -z "$1" ]
  then
    echo "# Usage:
# $ bookmarkpath bmp
# $ lsbmp to list all bookmarkpath
# already used bookmarkpath are"
    lsbmp
  else
    lsbmp
#    export $1=`pwd`;
    let "bmpcounter++"
    export $1$bmpcounter=`pwd`;
  fi
}
alias bookmarkpath=bookmarkpathvar
############################################

输出

john@debian1:~$ 书签路径 bmp
bmpcounter 为空
john@debian1:~$ cd 0_test/
john@debian1:~/0_test$ 书签路径 bmp
echo $bmp1
john@debian1:~/0_test$ lsbmp
echo $bmp1
john@debian1:~ /0_test$ 回声 $bmp0

john@debian1:~/0_test$ echo $bmp1
/home/john
john@debian1:~/0_test$ echo $bmp2
/home/john/0_test
john@debian1:~/0_test$

以下更新(截至 20170615 0117)

ilkkachu(来自下面的评论),感谢您的帮助。

按顺序(并编号)回答您的问题和陈述:

  1. 它看起来很奇怪,因为它是一个别名(是我的 .bashrc 文件的一小部分),并且打算在命令行环境中运行(在我的例子中是 gnome-terminal)。我会看看是否可以从问题中删除单词脚本,以免造成混淆(尽管您的帖子可以在脚本中使用)。

  2. 我正在尝试做的是使用别名(书签 bmp)为我当前的路径添加书签,然后像 ls 一样以列表形式调用所有书签(使用 lsbmp)(以及 cd(使用 cdbmp)到它们中)。

  3. 和 4. 你对 -z 测试和 for 循环的权利。我真的不知道如何应对挑战,而且由于最近的手术和止痛药,我没有充分利用脑力。在你的帖子之后,我意识到并减少了药物,所以我的脑力更高:) 这个故事的寓意是不要药物和代码哈哈

  4. 是的,一个数组会并且确实可以很好地工作(感谢您)。我不得不承认,如果没有你的帖子和鼓励,我不会走阵列路线。谢谢你。我会将这些经验和技能添加到我的联系人中。

  5. "alias lsbmp=lsbmpvar" 此别名用于命令行环境(gnome-terminal)。所以别名部分是调用函数所必需的。

  6. 你猜对了。请原谅我的别名/脚本混淆。我也应该更好地评论代码。从现在开始我会的。

我采用了您的简单、简洁和雄辩的代码(进行了一些小的调整)并将其添加到我的 .bashrc 文件中。它工作得很好!我已在我最初发布的问题下方附加了完成的代码和输出,以防其他人想要一份副本。

再次感谢,祝您有美好的一天!

更新和最终代码

# list current bookmarked paths
bmp=()
lsbmpvar() {
    if [ "${#bmp[@]}" = 0 ] ; then
        echo bmp is currently empty
    else
        i=0
        for x in "${bmp[@]}" ; do 
            echo "bmp$i: $x"
            let i++
        done
    fi
}
bmpadd() {
    bmp+=( $(pwd) )
    lsbmpvar
}
alias lsbmp=lsbmpvar
alias bmp=bmpadd


# bookmark currrent path for later recall
bookmarkpathvar() {
  if [ -z "$1" ]
  then
    echo "# Usage:
# $ bookmarkpath bmp (to add a bmp#)
# $ lsbmp (to list all bookmarked paths)
# $ cdbmp number (cdbmp 0) to move to that path (bmp0)
# current bookmarked paths are:"
    lsbmpvar
  else
    echo "# current path ( $(pwd) ) is now bookmarked to bmp"${#bmp[@]}"
# current bookmarked paths are:"
    bmpadd
  fi
}
alias bookmarkpath=bookmarkpathvar


cd_to_bmp() {
  if [ -z "$1" ]
  then
    echo "# Usage:
# $ cdbmp 0
# $ cdbmp number (cdbmp 0) to move to that path (bmp0)
# current bookmarked paths are:"
    lsbmpvar
  else
    echo "# moving to bmp$1 now"
    lsbmpvar
    cd ${bmp[$1]}
  fi
}
alias cdbmp=cd_to_bmp

输出:

john@debian1:~$ bookmarkpath    
# Usage:    
# $ bookmarkpath bmp (to add a bmp#)    
# $ lsbmp (to list all bookmarked paths)    
# $ cdbmp number (cdbmp 0) to move to that path (bmp0)    
# current bookmarked paths are:    
bmp is currently empty    
john@debian1:~$ bookmarkpath bmp    
# current path ( /home/john ) is now bookmarked to bmp0    
# current bookmarked paths are:    
bmp0: /home/john    
john@debian1:~$ cd 0_test/    
john@debian1:~/0_test$ bookmarkpath bmp    
# current path ( /home/john/0_test ) is now bookmarked to bmp1    
# current bookmarked paths are:    
bmp0: /home/john    
bmp1: /home/john/0_test    
john@debian1:~/0_test$ lsbmp    
bmp0: /home/john    
bmp1: /home/john/0_test    
john@debian1:~/0_test$ cd ${bmp[0]}    
john@debian1:~$ pwd    
/home/john    
john@debian1:~$ cdbmp 1    
# moving to bmp1 now    
# current bookmarked paths are:    
bmp0: /home/john    
bmp1: /home/john/0_test    
john@debian1:~/0_test$ bookmarkpath    
# Usage:    
# $ bookmarkpath bmp (to add a bmp#)    
# $ lsbmp (to list all bookmarked paths)    
# $ cdbmp number (cdbmp 0) to move to that path (bmp0)    
# current bookmarked paths are:    
bmp0: /home/john    
bmp1: /home/john/0_test    
john@debian1:~/0_test$     

享受!

4

1 回答 1

0

好的,该脚本看起来有些奇怪,阅读它,我什至不确定您要做什么。然而,这里有一些想法。

if [ -z "$bmpcounter" ]; then
    bmpcounter=0

您确实意识到这-z不会针对数字零测试以下单词,而是检查它是否为空字符串?那里的分配使bmpcounter非空。

for bmpcount in $bmpcounter

for循环列出的单词,在这种情况下,出现的单词 when$bmpcounter被拆分。你只是bmpcounter在上面的赋值中设置为零,然后是let "bmpcounter++",所以它只会包含一个单词:一个数字。在循环结束时递增bmpcount不会做任何事情,仍然只会进行一次循环迭代。也许您想改用循环while

export $1$bmpcounter=`pwd`;

这看起来像你真的想使用数组

bmp=(foo bar)         # initialize to contain two items
bmp+=(quux)           # append a third
for x in "${bmp[@]}" ; do   # loop over all items of the array
    something "$x"
done
echo "${bmp[0]}"      # access item at index zero

我什至不确定您要做什么,bm1以及bm为什么要在可以使用echo "echo bmp$bmpcounter"(或类似的东西)时使用这两个麻烦。

alias lsbmp=lsbmpvar

这似乎不是很有用。为什么不直接命名函数lsbmp呢?


我怀疑你想要的是这样的:

bmp=()
lsbmp() {
    if [ "${#bmp[@]}" = 0 ] ; then
        echo bmp is empty
    else
        i=0
        for x in "${bmp[@]}" ; do 
            echo "$i: $x"
            let i++
        done
    fi
}
bmpadd() {
    lsbmp
    bmp+=( $(pwd) )
} 
于 2017-06-14T15:05:42.763 回答