2016-04-30 6 views
2
# while read a b ; do echo $a $b ; done < `for i in \`cat users.txt\` ; do PHPVER=\`selectorctl --user-current --user=$i\` ; echo $i $PHPVER ; done | awk '{print $1, $2}' | sed 's/native/5.3/g'` 

-bash: `for i in \`cat users.txt\` ; do PHPVER=\`selectorctl --user-current --user=$i\` ; echo $i $PHPVER ; done | awk '{print $1, $2}' | sed 's/native/5.3/g'`: ambiguous redirect 

Если удалить время чтения заявления, выход:Использование «во время чтения» и «для г в» приводит к неоднозначной редиректа

# for i in `cat users.txt` ; do PHPVER=`selectorctl --user-current --user=$i` ; echo $i $PHPVER ; done | awk '{print $1, $2}' | sed 's/native/5.3/g' 

user1 5.4 
user2 5.4 
user3 5.3 

Так что мне нужно взять эти 2 колонки и поворот каждый в переменный таким образом, я могу затем запустить их в команде, как так:

# selectorctl --set-user-current=$b --user=$a 

однако, когда я добавляю в то время как прочитал заявление, он бросает неоднозначный редирект

+1

Прежде всего, используйте '$ (...)' Вместо backquotes ('\'.. \ ''). Это делает вложение гораздо проще - не нужно использовать что-то вроде '\\' ' – anishsane

+1

& Your' <$ (for ...) 'должно быть изменено на' <<(для ...) ' – anishsane

+2

Посмотрите на http : //www.shellcheck.net/ – anishsane

ответ

4

Это действительно неясно, что вы пытаетесь сделать. Возможно, вы захотите сделать что-то вроде

while read -r user; do 
    read phpver rest < <(selectorctl --user-current --user="$user") 
    output="$user $phpver" 
    echo "${output//native/5.3}" 
done < users.txt 

Don't use for to read lines from a file.

+0

Довольно грустно, что я использую для чтения файлов навсегда, просто привычка, что я никогда не был новым. Как echo "$ {output // native/5.3}" замените native 5.3, я думал, что вам всегда приходилось использовать что-то вроде sed для замены. Я попробовал googling //, но это эхо, которое может заменить или? Super confused on the Кроме того, вывод selectorctl --user-current --user = "$ user" дает более двух слов, например: пользователь 5.5 5.5.34/opt/alt/php55/usr/bin/php-cgi , поэтому я использовал awk. Могу ли я «awk» первые 2 слова $ 1 $ 2 в этом выражении эха? – JCats

+0

@JCats: прочитайте 3-й раздел в http://mywiki.wooledge.org/BashGuide/Parameters (замены параметров) для информации о '$ {var // targ/repl}'. Справедливости ради, это довольно неясная, но очень мощная особенность оболочки. Удачи. – shellter

+1

@JCats, было бы неплохо включить эту деталь в ваш вопрос. Обновлено. Это замена процесса: вы можете прочитать об этом в руководстве bash. –

0
while read -r user; do 
    phpver=$(selectorctl --user-current --user="$user") 
    output="$user $phpver" 
    echo "${output//native/5.3}" | awk '{print $1, $2}' 
done < users.txt 

Является ли размещение AWK нормально здесь или будет ли быть более правильный способ удаления лишних строк из вывода, который в данном случае является:

user 5.4 5.4.45 /opt/alt/php54/usr/bin/php-cgi 

, но мне нужно

user 5.4 
+1

http://mywiki.wooledge.org/DontReadLinesWithFor –

+1

... и у вас есть куча котировок ошибок, которые http://shellcheck.net/ будет ловить. –

+0

Я скорректировал кавычки, поскольку для утверждения for, я должен немного обходиться с ним. – JCats