Intereting Posts
Является ли сумма всех PID «utime» общей системной утилитой? date: неверная дата -d для строки в другом часовом поясе Тестирование, если строка существует внутри массива строк Почему мой initrd имеет только один каталог, а именно «ядро»? Указатель имени домена хоста в Linux Как фильтровать все файлы типа, содержащие шаблон Переслать сетевой трафик хоста на другой хост, за исключением трафика SSH Подключение ssh к OSMC завершается сбоем после ввода правильного пароля Исключить определенную сеть из правил tc FUSE зависает, пытаясь подключить сетевую файловую систему при входе в систему Очистка экрана GNU после полноэкранного приложения iptables nat loopback для внешнего трафика Почему mdadm считает мой raid1 «неудачным, поэтому использование –add не может работать»? NetworkManager на Fedora 15 не может найти часто используемую беспроводную сеть Откройте окно командной строки в GNOME Desktop

Исключая последний аргумент / параметр из цикла for

Я ищу, чтобы создать сценарий оболочки, который будет проходить через каждый параметр / параметр, за исключением последнего. Вот что я имею до сих пор:

for i in $@ do echo "$i" done 

Это хорошо работает с точки зрения отображения всех аргументов после моей команды ./script.sh, но я надеюсь, что есть способ игнорировать последний параметр или даже любой параметр моего выбора (например, всегда игнорируя третий параметр, если там это один). Чтобы быть ясным, меня больше беспокоит последний параметр / аргумент.

Я новичок в написании сценариев, поэтому прошу прощения, если есть еще одна запись, в которой содержится этот ответ. Я считаю, что быть новым в чем-то обычно означает, что вы не знаете, как правильно спросить, что вы ищете.

Любая помощь будет принята с благодарностью!

Если вам не нужно сохранять параметры

 while (( $# > 1 )) do echo "$1" shift done 

Если вы хотите сохранить позиционные параметры нетронутыми, вы можете сохранить счет

 SKIP=$# let x=1 for i do if (( x != SKIP )) then echo "$i" fi let x=x+1 done 

У CentOS, вероятно, есть Bash, поэтому, если вы можете использовать его, вы можете запустить срез массива:

 for x in "${@:1:$# - 1}" ; do echo do something with "$x" done 

Обозначение ${@:n:m} принимает m позиционных параметров, начиная с номера n . Мы выбираем их общее число из $# и декремент на единицу, чтобы игнорировать последний параметр. Смещение и длина берутся как арифметические выражения, как в $((...)) , поэтому мы можем сделать арифметику прямо там, как сказал Стефане ниже. Индексы массивов обычно начинаются с нуля, но в случае $@ начинающегося с нуля, вы получите имя оболочки от $0 и это не то, что мы хотим.

Обратите внимание, что вы, скорее всего, захотите процитировать выражения $@ или ${@:n:m} чтобы предотвратить дальнейшее разделение ваших аргументов.

 skip_last() { p=$1; shift for i do set ${1+"$@"} "$p"; p=$1; shift done for i do # do something with i when i != last now echo "$i" done } # and then... skip_last "a" "b" "c" "d" "e" 

Вы можете использовать цикл for, который устанавливает переменную i в 1 , 2 , … n-1 и использует косвенное расширение, чтобы превратить это в $1 , $2 , …, $n-1 .

 for ((i=1; i<$#; i++)); do echo "${!i}" done