$1 пусто при запуске bash -c scriptname arg

Я пытался разработать простой скрипт bash, в котором используется один позиционный параметр. Но ни с того ни с сего параметр пуст. Сценарий bash приведен ниже.

#!/bin/bash
ulimit -s hard
if [ "$1" != "" ]; then
    echo "Positional parameter 1 contains something"
else
    echo "Positional parameter 1 is empty"
fi
root="$(dirname "$(readlink -f "$1")")"
dir="$(basename "$(readlink -f "$1")")"
path=$root/$dir
echo $path

Пока я запускал файл скрипта следующим образом, он показывает пустые строки. скриншот вывода

Я использовал команду bash -c, так как мне нужно запустить скрипт bash из кода Java, используя класс ProcessBuilder.

Я очень мало знаю о сценариях Bash, и я попытался более простым способом, как:

root=`dirname $1`
dir=`basename $1`
path=$root/$dir

Но результат все тот же.

1 ответ

Решение

Из документации bash:

Если -c опция присутствует, тогда команды читаются из строки. Если после строки есть аргументы, они присваиваются позиционным параметрам, начиная с $0,

Акцент здесь сделан на оригинале, что приятно, поскольку это немного удивительно, но мы можем увидеть это с помощью:

bash -c 'echo zero: $0 one: $1 two: $2' a b c

который производит:

zero: a one: b two: c

в качестве вывода.

Короче говоря, вы должны вставить дополнительный аргумент, чтобы взять $0 положение или корректировка всех ваших аргументов номеров (я бы пошел на первое решение).

Другие вопросы по тегам