Примите ввод в командной строке, а не в интерактивном режиме. (Пожалуйста!)
Это достаточно просто, я бы просто использовал функцию оболочки.
iter_the_command() {
max=5
[ "$#" -eq 1 ] && [ "$1" -ge 1 ] && [ "$1" -le "$max" ] ||
{ printf 'Error: please pass a number from 1 to %d\n' "$max" >&2;
return 1;}
for i in $(seq "$max"); do
[ "$i" -eq "$1" ] && continue
somecommand "$1" "$i"
done
}
Однако , у меня есть сильное подозрение, что это XY-вопрос, и то, что вы на самом деле пытаетесь сделать, было бы легче выполнить напрямую. (Другими словами, мне трудно представить себе сценарий, в котором приведенный выше код был бы действительно полезным и выполнял бы необходимую функцию, которую нельзя было бы сделать иначе.)
При первом выполнении цикла x
будет 1
, поэтому вы выполняете echo $(1 >> c.txt)
, а оболочка пытается выполнить 1
, но не находит.
Если вы добавите то, что на самом деле пытаетесь сделать, мы сможем указать, что нужно изменить.
Что делает оболочка, когда видит echo $($x >> c.txt)
, так это сначала обрабатывает подстановку команд $($x >> c.txt)
. Это будет заменено выводом команды $x >> c.txt
. $x
— это 1
в первой итерации цикла, но такой команды нет, поэтому ошибки (будут одной ошибкой для каждой итерации цикла, если у вас нет команд, соответствующих целым числам в диапазон от 1 до 10; вывод в вопросе, вероятно, усечен ).
Возможно, вы хотели сделать что-то вроде
for x in $(seq 10); do
echo "$x" >>c.txt
done
(без подстановки команд )или просто
seq 10 >>c.txt
, что имело бы эквивалентный эффект.
Я думаю, что ваше определение bash неправильно определено в сценарии.
Выход:
-bash: 1: command not found
Обычно относится к плохо написанному определению bash, убедитесь, что оно определено следующим образом в первой строке скрипта:
#!/bin/bash
Если местоположение bash отличается, вы также можете найти его с помощью:
which bash