Разделение параметра командной строки удара

У меня было это, это было stty в .kshrc. Помните, что .kshrc получен на всех ksh сценариях, интерактивных и не интерактивный. Если Вы запустите скрипт, то stty будет все еще стрелять, попытаться работать над stdin, который является файлом (не tty теперь) и сбой с ошибкой.

5
31.05.2012, 02:27
2 ответа

Иначе должен был бы использовать IFS, встроенный метод оболочки для разделения строк на поля.

OLDIFS=$IFS
IFS=':'
set -f
for host in $hostlist; do
  set +f
  echo "$host"
done
set +f
IFS=$OLDIFS

set -f выключает поколение имени файла (globbing): без него, подстановочные знаки *?\[ был бы расширен в каждом слове.

7
27.01.2020, 20:35

Я думаю, что простое решение состоит в том, чтобы только использовать удар builtins:

#!/bin/bash
hostlist=${1//:/ }  # this will replace all : with a space

for host in $hostlist ; do
    echo ${host}
done

Иначе (еще более простой, чем Ваше awk решение) должен использовать сокращение, хотя это, вероятно, зависит от сокращения GNU.

#!/bin/bash
hostlist=$(echo $1 | cut -d : --output-delimiter=" " -f 1-) 

for host in $hostlist ; do
    echo ${host}
done
3
27.01.2020, 20:35
  • 1
    Это предполагает, что нет никаких специальных символов (никакой пробел или globbing символы) на имена. Это, вероятно, будет верно в “hostlist”, но не общей технике. –  Gilles 'SO- stop being evil' 31.05.2012, 02:27

Теги

Похожие вопросы