0

我收到以下错误:

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

我正在尝试获取之前的.号码

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

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

所以理想情况下,这应该工作:

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

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

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

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

4

3 回答 3

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

杀死我所有的工作......通常我会在cut'ing之前找出工作名称......

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

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

查看我所有的“map_...”工作:

idlist "map_*"

为了杀死我所有的“map_....”工作:

idlist "map_*" | xargs qdel
于 2013-09-19T12:41:22.317 回答
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 个字符。)我不知道它们中的任何一个都特别干净,但它们在没有临时变量的情况下这样做......

于 2013-08-05T22:40:28.100 回答
0

还有另一种方法:

    foreach   m1 in $(qstat -a );do
           if [[ $m1 =~ kig ]];then
               m2=${m1%.kig}
               echo "kig found $m2 "
               break
           fi
    done
于 2013-08-05T23:02:57.383 回答