2013-08-05 4 views
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 

и использовать его в качестве аргумента qdel в openPBS, чтобы я мог удалить все процессы, которые я начал с моего входа kigumen

так идеально, это должно работать:

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

до сих пор, только это работает:

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

, но я хочу чистый Однострочник без временной переменной.

ответ

1

Используемая конструкция подстроки оболочки (: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 символов) я не знаю, что любой из них особенно чище, но они делают это без переменной темп ...

+0

есть способ замаскировать подстановку команды в качестве переменной? –

+1

Не забудьте сначала сохранить переменную. Подстановки оболочки не являются гнездовыми, как истинные строковые выражения, поэтому вы в основном получаете только одну «операцию» для каждой подстановки. например вы можете выполнить подстановку команд или подстроку переменной ИЛИ переменную с удаленным шаблоном или переменную с удаленным шаблоном суффикса ... но только один из них за раз. –

0

еще другие способы:.

foreach m1 in $(qstat -a);do 
      if [[ $m1 =~ kig ]];then 
       m2=${m1%.kig} 
       echo "kig found $m2 " 
       break 
      fi 
    done 
1
qstat -u palle | cut -f 1 -d "." | xargs qdel 

Ki LLS все мои рабочие ... обычно я Grep из имя задания (ы) перед cut'ing ...

Поэтому я использую небольшой скрипт «список_идентификаторов»:

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

Чтобы увидеть все мои «map_ ...»рабочие места:

idlist "map_*" 

За убийство всех моих„сопоставляют _....“рабочие места:

idlist "map_*" | xargs qdel 

 Смежные вопросы

  • Нет связанных вопросов^_^