运行bash -c scriptname arg时,“$ 1”为空

时间:2018-01-19 23:41:48

标签: linux bash shell positional-parameter

我正在尝试开发一个简单的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

当我以下列方式运行脚本文件时,它显示空字符串。screenshot of output

我正在使用bash -c命令,因为我需要使用ProcessBuilder类从java代码运行bash脚本。

我对bash脚本的了解很少,我尝试了更简单的方式:

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

但结果完全一样。

1 个答案:

答案 0 :(得分:4)

来自the bash documentation

  

如果存在-c选项,则从 string 中读取命令。如果字符串后面有参数,则会将它们分配给位置参数,从 $0 开始。

这里强调的是原版,这很好,因为它有点令人惊讶,但我们可以看到它:

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

产生:

zero: a one: b two: c

作为输出。

简而言之,你应该插入一个额外的参数来占据$0位置,或者调整你所有的参数数字(我会选择以前的解决方案)。