我正在尝试将变量从set
命令传递到bash
脚本。
$ set BeginTime=2021-10-11 2:23:00 & ./getBeginTime.sh
文件getBeginTime.sh
:
local getBeginTime=$(set | grep BeginTime)
echo "BeginTime : = $getBeginTime"
请解释为什么echo $getBeginTime
返回空字符串
答案1
您的代码中存在许多误解
直接分配一个变量,不带
set
,记住引用被分配的字符串,如果它包含空格或其他 shell 特有的字符(如果有疑问,引用)BeginTime='2021-10-11 2:23:00'
不要在小时候运行作业。子进程不能影响其父进程。通过运行分配,
&
您可以在子进程中分配值,该子进程会立即退出,而父进程保持不变该值尚未提供给环境(使用
export
),因此要将其传递给脚本,您应该将其包含在命令行中:./getBeginTime.sh "$BeginTime"
然后,您可以在脚本中选取该值作为第一个参数:
#!/bin/sh getBeginTime="$1" echo "BeginTime : = $getBeginTime"
编写该语句的更好方法
echo
是使用printf
.该echo
命令在 shell 中是非标准的,并且不同的实现以不同的方式处理某些字符序列。另一方面printf
更加标准化。这里是与您的变量%s
对应的参数的占位符"$getBeginTime"
printf "BeginTime : = %s\n" "$getBeginTime"
如果您确实想将值作为环境变量传递,下一节将说明两种方法,但请注意,这些是传递值的不太常见的方法:
# Define an environment variable just for this invocation
BeginTime='2021-10-11 2:23:00' ./getBeginTime.sh
或者
# Define an environment variable for the remainder of this session
export BeginTime='2021-10-11 2:23:00'
# You can now use it as many times as you want
./getBeginTime.sh
./getBeginTime.sh
在您的代码中,您只需将其用作"$BeginTime"
变量即可。
答案2
以下是实现此目的的两种方法:
1.使用环境变量:
从 bash 终端设置变量:
export BeginTime="2021-10-11 2:23:00"
然后从一个非常简单的脚本中test.sh
调用该变量:
[ws] user test_directory >cat test.sh
echo $BeginTime
2. 通过传递参数:
该脚本test.sh
现在只是:
[ws] user test_directory >cat test.sh
echo $1
你用参数来称呼它:
[ws] user test_directory > bash test.sh "2021-10-11 2:23:00"