echo $ 1 = разделенная строка без кавычек?

find example -name \*.txt | sed 's/\.txt$//' | xargs -n 1 mkdir

Предупреждение: для этого необходимо, чтобы ваши пути не содержали символы новой строки.

Изменить: см. Комментарий Тердона, если вы используете инструменты GNU.

1
13.02.2017, 00:09
2 ответа

Вы можете изменить сценарий на

#!/bin/sh
echo "$*"

«$ *» расширяется до одной строки, которая состоит из всех аргументов, переданных в строку, соединены с пробелом между каждым аргументом. Таким образом,

$ ./script 1 2 3
1 2 3

Но это не передает то, что буквально следует за именем сценария в командной строке. Это было бы невозможно. Например, несколько пробелов сжимаются вместе, поскольку они просто разделяют аргументы:

$ ./script 1  2 3
1 2 3

Специальные символы оболочки по-прежнему расширяются.

$ ./script 2 * 2
2 bin dev etc home lib lost+found proc run sbin tmp sys usr var 2
$ ./script hello ; world
hello
bash: world: command not found

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

$ foo='2  *  2'
$ ./script $foo
2 bin dev etc home lib lost+found proc run sbin tmp sys usr var 2
3
27.01.2020, 23:25

Этот сценарий:

#!/bin/sh
echo $@

производит:

$ ./test.sh 1 23 4 5 6
$ 1 23 4 5 6
0
27.01.2020, 23:25

Теги

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