С
./script.sh <filename
вы прикрепляете стандартный ввод скрипта в целом к файлу filename
. Это означает, что все, что считывается со стандартного ввода в вашем скрипте, будет считываться из файла filename
до тех пор, пока не будет достигнут конец этого файла.
Например, сценарий, который вы вызовете описанным выше способом и который просто изменяет все символы на верхний -регистр, может быть записан как
#!/bin/sh
tr 'a-z' 'A-Z'
Обратите внимание, что filename
или<filename
не является аргументом скрипта, а инструкцией оболочке настроить стандартный ввод скрипта из файла.
С другой стороны, если вы запустили скрипт, используя
./scripts.sh filename
тогда имя файла будет доступно как $1
в скрипте, и вам придется ссылаться на это имя при чтении из файла:
#!/bin/sh
tr 'a-z' 'A-Z' <"$1"
или,
#!/bin/sh
filename=$1
tr 'a-z' 'A-Z' <"$filename"
Это позволит вам анализировать один и тот же файл несколько раз, в то время как чтение содержимого через стандартный ввод скрипта позволит вам прочитать файл только один раз (, если вы не сохранили его во временный файл в скрипте, используя, например cat >tmpfilename
, а затем проанализировал это ).
Указание имен файлов сценария в командной строке также позволит вам обрабатывать любое количество файлов в цикле:
#!/bin/sh
for pathname do
# code that processes "$pathname"
done
RHEL/Fedora/CentOS позволяют совместно устанавливать столько версий ядра Linux, сколько вам нужно.