命令替换作为一行中的变量

时间:2013-08-05 22:23:22

标签: string bash zsh pbs command-substitution

我收到以下错误:

> echo "${$(qstat -a | grep kig):0:7}"
-bash: ${$(qstat -a | grep kig):0:7}: bad substitution

我正试图在<{p>} .之前取数字

> qstat -a | grep kig
1192530.perceus-     kigumen     lr_regul pbs.sh            27198     2     16    --  24:00:00 R 00:32:23

并将其用作openPBS中qdel的参数,以便我可以删除我使用登录kigumen开始的所有进程

理想情况下,这应该有效:

qdel ${$(qstat -a | grep kig):0:7}

到目前为止,只有这个有效:

str=$(qstat -a | grep kig); qdel "${str:0:7}"

但我想要一个没有临时变量的干净单行。

3 个答案:

答案 0 :(得分:1)

您正在使用的shell子字符串构造(:0:7)仅适用于变量,而不适用于命令替换。如果您想在单个操作中执行此操作,则需要将字符串修剪为管道的一部分,如下所示:

echo "$(qstat -a | grep kig | sed 's/[.].*//')"
echo "$(qstat -a | awk -F. '/kig/ {print $1}')"
echo "$(qstat -a | awk '/kig/ {print substr($0, 1, 7)}')"

(注意前两个打印在第一个“。”之前的所有内容,而最后一个打印前7个字符。)我不知道它们中的任何一个特别清洁,但它们没有临时变量。 ..

答案 1 :(得分:1)

qstat -u palle | cut -f 1 -d "." | xargs qdel

杀死我所有的工作...通常我会在切断之前把工作名称弄出来......

所以我使用一个小脚本“idlist”:

qstat -u palle | grep -E "*.in" | grep -E "$1" | cut -f 1 -d "." | xargs

要查看我所有的“地图_...”工作:

idlist "map_*"

杀死我所有的“map _....”工作:

idlist "map_*" | xargs qdel

答案 2 :(得分:0)

还有另一种方式:

    foreach   m1 in $(qstat -a );do
           if [[ $m1 =~ kig ]];then
               m2=${m1%.kig}
               echo "kig found $m2 "
               break
           fi
    done