Linux Commands and arguments
Introduction
In this session, we have covered the shell expansion by taking a close look at commands and arguments. Knowing shell expansion is important because many commands on your Linux system are processed and most likely changed by the shell before they are executed.
The command line interface or shell used on most Linux systems is called bash, which stands for Bourne again shell. The bash shell incorporates features from sh (the original Bourne shell), csh (the C shell), and ksh (the Korn shell).
This chapter frequently uses the echo command to demonstrate shell features. The echo command is very simple: it echoes the input that it receives.
arguments
One of the primary features of a shell is to perform a command line scan. When you enter a command at the shell’s command prompt and press the enter key, then the shell will start scanning that line, cutting it up in arguments. While scanning the line, the shell may make many changes to the arguments you typed.
This process is called shell expansion. When the shell has finished scanning and modifying that line, then it will be executed.
white space removal
Parts that are separated by one or more consecutive white spaces (or tabs) are considered separate arguments, any white space is removed. The first argument is the command to be executed, the other arguments are given to the command. The shell effectively cuts your command into one or more arguments.
This explains why the following four different command lines are the same after shell expansion.
The echo command will display each argument it receives from the shell. The echo command will also add a new white space between the arguments it received.
single quotes
You can prevent the removal of white spaces by quoting the spaces. The contents of the quoted string are considered as one argument. In the screenshot below the echo receives only one argument.
double quotes
You can also prevent the removal of white spaces by double quoting the spaces. Same as above, echo only receives one argument.
Later in this tutorial, when discussing variables we will see important differences between single and double quotes.
echo and quotes
Quoted lines can include special escaped characters recognized by the echo command (when using echo -e). The screenshot below shows how to use \n for a newline and \t for a tab (usually eight white spaces).
The echo command can generate more than white spaces, tabs, and newlines. Look at the man page for a list of options.
commands
external or builtin commands ?
Not all commands are external to the shell, some are builtin. External commands are programs that have their own binary and reside somewhere in the file system. Many external commands are located in /bin or /sbin. Builtin commands are an integral part of the shell program itself.
type
To find out whether a command given to the shell will be executed as an external command or as a builtin command, use the type command.
As you can see, the cd command is builtin and the cat command is external.
You can also use this command to show you whether the command is aliased or not.
running external commands
Some commands have both builtin and external versions. When one of these commands is executed, the builtin version takes priority. To run the external version, you must enter the full path to the command.
which
The which command will search for binaries in the $PATH environment variable (variables will be explained later). In the screenshot below, it is determined that cd is builtin, and ls, cp, rm, mv, mkdir, pwd, and which are external commands.
aliases
create an alias
The shell allows you to create aliases. Aliases are often used to create an easier to remember the name for an existing command or to easily supply parameters.
abbreviate commands
An alias can also be useful to abbreviate an existing command.
default options
Aliases can be used to supply commands with default options. The example below shows how to set the -i option default when typing rm.
Some distributions enable default aliases to protect users from accidentally erasing files (‘rm -i’, ‘mv -i’, ‘cp -i’)
viewing aliases
You can provide one or more aliases as arguments to the alias command to get their definitions. Providing no arguments gives a complete list of current aliases.
unalias
You can undo an alias with the unalias command.
displaying shell expansion
You can display shell expansion with the set -x, and stop displaying it with set +x. You might want to use this further on in this tutorial, or when in doubt about exactly what the shell is doing with your command.
Exercise, Practice and Solution:
1. How many arguments are in this line (not counting the command itself).
touch ‘/etc/cron/cron.allow’ ‘abc123.txt’ «abc456.txt»
Code:
2. Is tac a shell builtin command ?
Code:
3. Is there an existing alias for rm ?
Code:
4. Read the man page of rm, make sure you understand the -i option of rm. Create and remove a file to test the -i option.
Code:
5. Execute: alias rm=’rm -i’ . Test your alias with a test file. Does this work as expected ?
Code:
6. List all current aliases.
Code:
7. Create an alias called ‘city’ that echoes your hometown.
Code:
8. Use your alias to test that it works.
Code:
9. Execute set -x to display shell expansion for every command.
Code:
10. Test the functionality of set +x by executing your city and rm aliases.
Code:
11. Execute set +x to stop displaying shell expansion.
Code:
12. Remove your city alias.
Code:
13. What are the location of the cat and the passwd commands?
14. Explain the difference between the following commands :
echo
/bin/echo
Code:
15. Explain the difference between the following commands :
echo Hello
echo -n Hello
Code:
16. Display A B C with two spaces between B and C.
(optional)
Code:
17. Complete the following command (do not use spaces) to display exactly as soon below
The solution is to use tabs with \t.
18. Use echo to display the following exactly:
Code:
19. Use one echo command to display three words on three lines.
Источник
Аргументы командной строки Bash
Функциональность интерпретатора Bash позволяет работать не только со статистическими данными, записанными в скриптах. Иногда возникает необходимость добавить сценарию интерактивности, позволяя принимать внешние параметры скрипта для манипуляции ими в коде.
В этой статье будет рассмотрено, как принимать аргументы командной строки bash, способы его обработки, проверка опций, а также известные особенности при работе с ними.
Параметры скрипта Bash
Интерпретатор Bash присваивает специальным переменным все параметры, введённые в командной строке. В их состав включено название сценария, выполняемого интерпретатором. Такие переменные называются ещё числовыми переменными, так как в их названии содержится число:
- $0 — название сценария;
- $1 — первый параметр;
- .
- $9 — девятый параметр сценария.
Ниже приведён пример использования одного параметра скрипта Bash:
#!/bin/bash
factorial=1
for (( number = 1; number
Результат работы кода:
Переменная $1 может использоваться в коде точно так же, как и любая другая. Скрипт автоматически присваивает ей значение из параметра командой строки — пользователю не нужно делать это вручную.
Если необходимо ввести дополнительные параметры, их следует разделить в командной строке пробелами.
#!/bin/bash
total=$[ $1 * $2 ]
echo «Первый параметр равен $1.»
echo «Второй параметр равен $2.»
echo «Произведение параметров равно $total.»
Пример работы кода:
Командный интерпретатор присвоил числа 5 и 10 соответствующим переменным — $1 и $2.
Также параметрами могут быть и текстовые строки. Однако, если есть необходимость передать параметр, содержащий пробел (например имя и фамилию), его нужно заключить в одинарные или двойные кавычки, так как по умолчанию пробел служит разделителем параметров командной строки:
#!/bin/bash
echo «Добро пожаловать, $1»
Пример работы кода:
На заметку: кавычки, которые используются при передаче параметров, обозначают начало и конец данных и не являются их частью.
Если необходимо использовать больше 9 параметров для скрипта, то названия переменных немного изменятся. Начиная с десятой переменной, число, стоящее после знака $, необходимо заключать в квадратные скобки (без внутренних пробелов):
#!/bin/bash
total=$[ $ <10>* $ <11>]
echo «Десятый параметр равен $<10>»
echo «Одиннадцатый параметр равен $<11>»
echo «Произведение этих параметров равно $total»
Пример работы кода:
Получение названия скрипта Bash
Как уже упоминалось, имя сценария является самым первым параметром скрипта. Чтобы определить название программы, используется переменная $0. Такая необходимость возникает, например, при написании скрипта, который может выполнять несколько функций. Однако при этом возникает одна особенность, которую нужно учитывать на практике:
#!/bin/bash
echo «Имя сценария: $0»
Пример работы кода:
Как видно, если строкой, фактически переданной в переменную $0, является весь путь к сценарию, то на вывод будет идти весь путь, а не только название программы.
Если нужен скрипт, выполняющий различные функции с учётом того, под каким именем он был вызван из командной строки, придётся проделать дополнительную работу: удалить сведения о пути, который использовался для его вызова.
Для этого специально предусмотрена небольшая команда. Команда basename возвращает только название скрипта без абсолютного или относительного пути к нему:
#!/bin/bash
name=`basename $0`
echo «Имя запущенной программы: $name»
Результат работы кода:
Проверка параметров скрипта
Передача параметров Bash вынуждает соблюдать осторожность. Если сценарий написан с применением параметров, но запускается без них, то возникнут проблемы в работе программы.
Если попробовать запустить написанный ранее скрипт test2 без аргументов, то перед выводом команд echo будет отображена ошибка:
Чтобы предотвращать подобные ситуации, необходимо действовать на упреждение — проверять аргументы скрипта на наличие значений. Это настоятельная рекомендация при использовании параметров в командной строке, и только после ревизии стоит пускать их в дело:
#!/bin/bash
if [ -n «$1» ]
then
echo «Добро пожаловать, $1»
else
echo «Простите, вы не представились»
fi
Пример работы кода:
В данном случае использовалась опция -n из предыдущей статьи о сравнении строк в Bash для проверки на наличие значения в переменной, которая считала параметр.
Обработка неизветсного числа параметров
Для начала рассмотрим один из часто используемых инструментов при работе с параметрами Bash — команду shift. Её прямое назначение заключается в сдвиге параметров на одну позицию влево. Таким образом, значение из переменной $3 переместится в $2, а из $2 — в $1. Но из $1 значение просто отбросится и не сместится в $0, так как там неизменно хранится название запущенной программы.
Эта команда является эффективным способом обработки всех параметров, переданных сценарию, особенно, когда нельзя заранее узнать их количество. Достаточно лишь обработать $1, сделать сдвиг и повторить процедуру.
#!/bin/bash
count=1
while [ -n «$1» ]
do
echo «Параметр №$count = $1»
count=$[ $count + 1 ]
shift
done
Пример работы кода:
Этот скрипт выполняет цикл while, в условии которого указана проверка первого параметра на длину. И если она равна нулю, цикл прерывает свою работу. При положительном результате проверки команда shift сдвигает все параметры влево на одну позицию.
Ещё один вариант использование shift — смещать на несколько позиций. Для этого достаточно через пробел указать количество, на которое будет смещён ряд параметров скрипта.
#!/bin/bash
echo «Первый параметр из переданных: $1»
shift 2
echo «Теперь первый параметр: $1»
Пример работы скрипта:
На заметку: при использовании shift нужно быть осторожным, ведь сдвинутые за пределы $1 параметры не восстанавливаются в период работы программы.
Обработка опций в Bash
Помимо параметров скрипт может принимать опции — значения, состоящие из одной буквы, перед которыми пишется дефис. Рассмотрим 3 метода работы с ними в скриптах. Сперва кажется, что при работе с опциями не должно возникать каких-либо сложностей. Они должны быть заданы после имени запускаемой программы, как и параметры. При необходимости можно сделать обработку опций командной строки по такому же принципу, как это делается с параметрами.
По примеру выше можно применять shift для обработки простых опций. С помощью инструкции case можно определять, являются ли аргументы Bash опциями:
#!/bin/bash
while [ -n «$1» ]
do
case «$1» in
-a | -b | -c) echo «Найдена опция $1» ;;
*) echo «$1 не опция» ;;
esac
shift
done
Пример работы программы:
Блок case работает правильно вне зависимости от того, как расположены аргументы командной строки bash.
Выводы
Для того, чтобы сделать свою программу более интерактивной, можно использовать параметры Bash. Встроенные переменные, в названиях которых фигурирует число, обозначают порядок указанных для программы параметров.
Команда basename используется для обрезания пути запущенного сценария, что часто необходимо для создания гибких программ. Использование команды shift позволяет эффективно проходить по переданным скрипту параметрам, особенно когда их количество неизвестно.

Источник