如果输出字符串是已声明的变量,如何执行 bash 别名或脚本

how to execute a bash alias or script were the output string is an already declared variable

第一post:)

几天来一直在寻找和研究这个挑战的答案。我不知道我错过了什么。可能要靠近它才能看到 :) 无论如何,继续挑战吧。下面是我的 .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 "" ]
  then
    echo "# Usage:
# $ bookmarkpath bmp
# $ lsbmp to list all bookmarkpath
# already used bookmarkpath are"
    lsbmp
  else
    lsbmp
#    export =`pwd`;
    let "bmpcounter++"
    export $bmpcounter=`pwd`;
  fi
}
alias bookmarkpath=bookmarkpathvar
############################################

产出

john@debian1:~$ bookmarkpath bmp
bmpcounter is empty
john@debian1:~$ cd 0_test/
john@debian1:~/0_test$ bookmarkpath bmp
echo $bmp1
john@debian1:~/0_test$ lsbmp
echo $bmp1
john@debian1:~/0_test$ echo $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)中是 运行 ).我会看看是否可以从问题中删除脚本一词,以免造成混淆(尽管您的 post 可以在脚本中使用)。

  2. 我想做的是使用别名(书签 bmp)为我的当前路径添加书签,然后像 ls 一样(和 cd)以列表形式调用所有书签(使用 lsbmp) (使用 cdbmp)也放入其中)。

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

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

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

  6. 你猜对了。请原谅我 alias/script 的困惑。我也应该更好地评论代码。以后我会的。

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

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

更新和最终代码

# 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 "" ]
  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 "" ]
  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 now"
    lsbmpvar
    cd ${bmp[]}
  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$     

尽情享受吧!

好的,那个脚本看起来有点奇怪,读了它,我什至不确定你想做什么。然而,这里有一些想法。

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

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

for bmpcount in $bmpcounter

for 遍历列出的单词,在本例中是拆分 $bmpcounter 时出现的单词。您只是将上述赋值中的 bmpcounter 设置为零,然后将 let "bmpcounter++" 设置为零,因此它只会包含一个词:一个数字。在循环结束时递增 bmpcount 不会做任何事情,仍然只会进行一次循环迭代。也许您想改用 a while loop

export $bmpcounter=`pwd`;

这看起来你真的很想用 arrays

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

我什至不确定你想用 bm1bm 做什么,为什么要用这两个,而你可以使用 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) )
}