如果输出字符串是已声明的变量,如何执行 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(来自下面的评论),
谢谢你的帮助。
按顺序(并编号)回答您的问题和陈述:
它看起来很奇怪,因为它是一个别名(是我的 .bashrc 文件的一小部分)并且在命令行环境(在我的例子中是 gnome-terminal)中是 运行 ).我会看看是否可以从问题中删除脚本一词,以免造成混淆(尽管您的 post 可以在脚本中使用)。
我想做的是使用别名(书签 bmp)为我的当前路径添加书签,然后像 ls 一样(和 cd)以列表形式调用所有书签(使用 lsbmp) (使用 cdbmp)也放入其中)。
和 4. 您对 -z 测试和 for 循环的看法是正确的。我真的不知道如何应对挑战,而且由于最近的手术和止痛药,我没有充分发挥脑力。在你 post 之后,我意识到并减少了药物,所以我的脑力更高了:) 这个故事的寓意是不要吃药和代码哈哈
是的,数组将会并且确实很好地工作(感谢您)。我不得不承认,如果没有您的 post 和鼓励,我是不会走阵列路线的。谢谢你。我会将这些经验和技能添加到我的 rolodex 中。
"alias lsbmp=lsbmpvar"
此别名用于命令行环境 (gnome-terminal)。所以别名部分是调用函数所必需的。
你猜对了。请原谅我 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
我什至不确定你想用 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) )
}
第一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 $bmp0john@debian1:~/0_test$ echo $bmp1
/home/john
john@debian1:~/0_test$ echo $bmp2
/home/john/0_test
john@debian1:~/0_test$
更新如下(截至 20170615 0117)
ilkkachu(来自下面的评论), 谢谢你的帮助。
按顺序(并编号)回答您的问题和陈述:
它看起来很奇怪,因为它是一个别名(是我的 .bashrc 文件的一小部分)并且在命令行环境(在我的例子中是 gnome-terminal)中是 运行 ).我会看看是否可以从问题中删除脚本一词,以免造成混淆(尽管您的 post 可以在脚本中使用)。
我想做的是使用别名(书签 bmp)为我的当前路径添加书签,然后像 ls 一样(和 cd)以列表形式调用所有书签(使用 lsbmp) (使用 cdbmp)也放入其中)。
和 4. 您对 -z 测试和 for 循环的看法是正确的。我真的不知道如何应对挑战,而且由于最近的手术和止痛药,我没有充分发挥脑力。在你 post 之后,我意识到并减少了药物,所以我的脑力更高了:) 这个故事的寓意是不要吃药和代码哈哈
是的,数组将会并且确实很好地工作(感谢您)。我不得不承认,如果没有您的 post 和鼓励,我是不会走阵列路线的。谢谢你。我会将这些经验和技能添加到我的 rolodex 中。
"alias lsbmp=lsbmpvar" 此别名用于命令行环境 (gnome-terminal)。所以别名部分是调用函数所必需的。
你猜对了。请原谅我 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
我什至不确定你想用 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) )
}