我有以下无法编辑的 bash 脚本(太多):
#! /bin/bash/
#filename: testbash
# User specific aliases and functions
test="test1"
echo $test
是否可以在更改测试变量的情况下将 testbash 作为源运行? IE:
>> . testbash
test1
>> . testbash -someargument(test="newtest")
newtest
答案1
我不确定我完全理解这些问题,但我认为这就是您想要的。
例子
[root@HomeTraining ~]$ cat example
#!/bin/bash
VAR1=$1
echo "$VAR1"
其中 $1 是命令中的第一个参数。
[root@HomeTraining ~]$ . example New_Text
New_Text
我想你可以做很多你想做的事。
#!/bin/bash
VAR1=$1
VAR2=$2
echo "$VAR1 $VAR2"
$ . example one two
one two
答案2
考虑到脚本当前的编写方式(它无条件地将字符串分配给变量,然后打印它),您无法使脚本看到 not 的另一个值$test
。获取脚本没有帮助。获取脚本要做的唯一一件事就是将变量设置为当前环境中的值,而不管其先前的值如何。test1
test1
test
test1
你可以让你的脚本有一个默认值通过给脚本提供命令行参数可以覆盖它。
在最简单的情况下,这可能看起来像
#!/bin/sh
value=${1:-test1}
printf 'value is %s\n' "$value"
我避免使用变量的名称test
,因为这也是标准实用程序的名称。并不是说它会导致问题,而是它使代码更容易阅读。我也在使用/bin/sh
而不是bash
在 - 行中,#!
因为脚本不使用任何bash
- 特定功能。bash
但它仍然可以通过、 ksh
、yash
和zsh
任何其他 POSIX shell 执行。
这会将变量的值设置value
为第一个命令行参数的值,除非未提供,在这种情况下它被设置为 string test1
。这是一个标准参数替换,如果是空字符串或者该变量未设置,则${parameter:-word}
扩展为。word
$parameter
测试:
$ ./script.sh
value is test1
$ ./script.sh hello
value is hello
允许脚本采用一个选项 ,-v
该选项采用单个选项参数:
#!/bin/sh
value=test1
while getopts 'v:' opt; do
case $opt in
v) value=$OPTARG ;;
*) echo 'error in command line parsing' >&2
exit 1
esac
done
# not needed if you're not expecting operands after the options
# on the command line:
shift "$(( OPTIND - 1 ))"
printf 'value is %s\n' "$value"
测试最后一个脚本:
$ ./script.sh
value is test1
$ ./script.sh -v hello
value is hello