我有一个批量运行 SAS 代码run_sas.sh
的命令的包装器。sas
典型的调用如下所示
./run_sas.sh -sysin /my_code/my_program.sas -log /my_log_folder/my_program.log
run_sas.sh
将所有参数传递给sas
with./sas $*
。sas
然后运行/my_code/my_program.sas
并将日志写入/my_log_folder/my_program.log
.- 然后
run_sas.sh
分析它被调用的参数 - 并将日志复制到
/admin/.hidden_log_folder/my_program_<today's date>.log
我想做两个改变:
启用多字参数
有些客户绝对希望我在文件夹和文件名中使用空格并要求我运行/their code/their program.sas
,所以如果我运行
./run_sas.sh -sysin "/their code/their program.sas" -log "/their log folder"
/their code/their program.sas
并且/their log folder
应该将单个参数传递给sas
删除特定参数
有时我需要运行./sas_utf8
而不是./sas
我懒得维护第二个脚本,所以我想允许一个额外的参数,这样
./run_sas.sh -sysin /my_code/my_program.sas -log /my_log_folder -encoding utf8
会打电话
./sas_utf8 -sysin /my_code/my_program.sas -log /my_log_folder
代替
./sas -sysin /my_code/my_program.sas -log /my_log_folder
我该怎么做,最好是在ksh
?
首先,使用
"$@"
代替$*
(或$@
)来保持参数不变。它将每个参数扩展为一个单独的单词,就好像您使用"$1" "$2"...
了注意,使用$*
, glob 字符也是一个问题。要查找 utf8 选项,您可以遍历命令行参数,然后将要保留的参数复制到另一个数组,并在看到
-encoding
and时设置一个标志utf8
。然后只需检查标志变量以确定要运行的程序,并传递
"${sasArgs[@]}"
给命令。所以:
最后一次
printf
调用打印它将运行的参数,<>
每个参数都有,因此您可以检查带有空格的参数是否保持不变。(您可以运行echo "${sasArgs[@]}"
,但它无法从单个参数中分辨出两个参数foo
和。)bar
foo bar
for
如果我们正在寻找单个参数,而不是两个参数对,则可以使用循环使第一部分变得更简单:这也可以转换为普通的 POSIX sh。循环复制它给出的
for
列表,因此复制的参数可以存储回位置参数(附加set -- "$@" "$arg"
)而不是使用数组。此外,如果知道编码参数在开始时,整个交易可以变得更简单。
$1
然后检查(and )就足够了$2
,它们可以用 . 删除shift
。(我用 Bash 和我在 Debian 上的 ksh93 版本测试了上面的脚本。我对 ksh 不太熟悉,所以我可能遗漏了一些东西。但是 Bash 的数组是从 ksh 复制的,所以我希望它应该可以正常工作同时。)