在 shell 脚本中增加输入变量号
Increment input Variable Number in shell Script
我有很多脚本在读取输入参数。我需要将所有输入参数增加 1。因此,如果它是 1,则它需要是 2 & 2 需要是 3 等等。是否有任何 unix 命令可以一次性替换所有脚本而不是转到每个脚本并手动进行。我是 Unix 的新手,不确定是否有任何方法可以做到。下面是例子。感谢对此的任何帮助。
更改前
#!/bin/ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
修改后
#!/bin/ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
编辑: 要在没有 GNU awk
的情况下将输出保存到 Input_file(s) 本身,请尝试以下操作(但请确保您 运行 我的第一个解决方案,以查看输出是否正确)。
假设我们有需要更改其值的脚本。
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file2.ksh
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file1.ksh
我们的 awk
脚本的名称是 script.ksh
以确保此脚本不会受到其自己的关注:)
cat script.ksh
awk '
FNR==1{
close(out)
out="out"++count
rename=(rename?rename ORS:"") "mv " out OFS FILENAME
}
match([=11=],/$[0-9]+/){
before=substr([=11=],1,RSTART)
value=substr([=11=],RSTART+1,RLENGTH)
rest=substr([=11=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest > (out)
}
END{
if(rename){
system(rename)
}
}
' file*sh
现在当我们 运行 通过执行 ./script.ksh
上面的脚本时,我们可以看到其中一个名为 file1.ksh
的文件的内容已经更改如下。
之前:
cat file1.ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
之后:
cat file1.ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
第一个解决方案: 考虑到您的脚本名称以 .sh
扩展名结尾,并且这个不会将输出保存到 Input_file(s),它会在终端上打印输出,仅供您检查输出是否正常。
awk '
match([=14=],/$[0-9]+/){
before=substr([=14=],1,RSTART)
value=substr([=14=],RSTART+1,RLENGTH)
rest=substr([=14=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh
第二个解决方案(仅使用较新版本的 GNU awk): 一旦您对上述命令的结果感到满意并且您有gawk
命令然后尝试执行以下操作,这应该将输出保存到 Input_file(s) 本身。恕我直言,这需要 gawk
4.1.0 + 版本。
awk -i inplace -v INPLACE_SUFFIX=.bak '
match([=15=],/$[0-9]+/){
before=substr([=15=],1,RSTART)
value=substr([=15=],RSTART+1,RLENGTH)
rest=substr([=15=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh
我有很多脚本在读取输入参数。我需要将所有输入参数增加 1。因此,如果它是 1,则它需要是 2 & 2 需要是 3 等等。是否有任何 unix 命令可以一次性替换所有脚本而不是转到每个脚本并手动进行。我是 Unix 的新手,不确定是否有任何方法可以做到。下面是例子。感谢对此的任何帮助。
更改前
#!/bin/ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
修改后
#!/bin/ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
编辑: 要在没有 GNU awk
的情况下将输出保存到 Input_file(s) 本身,请尝试以下操作(但请确保您 运行 我的第一个解决方案,以查看输出是否正确)。
假设我们有需要更改其值的脚本。
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file2.ksh
-rw-rw-r-- 1 ubuntu ubuntu 83 Dec 8 14:34 file1.ksh
我们的 awk
脚本的名称是 script.ksh
以确保此脚本不会受到其自己的关注:)
cat script.ksh
awk '
FNR==1{
close(out)
out="out"++count
rename=(rename?rename ORS:"") "mv " out OFS FILENAME
}
match([=11=],/$[0-9]+/){
before=substr([=11=],1,RSTART)
value=substr([=11=],RSTART+1,RLENGTH)
rest=substr([=11=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest > (out)
}
END{
if(rename){
system(rename)
}
}
' file*sh
现在当我们 运行 通过执行 ./script.ksh
上面的脚本时,我们可以看到其中一个名为 file1.ksh
的文件的内容已经更改如下。
之前:
cat file1.ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
之后:
cat file1.ksh
hv_bus_date="CAST('' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=
hv_act_id=
第一个解决方案: 考虑到您的脚本名称以 .sh
扩展名结尾,并且这个不会将输出保存到 Input_file(s),它会在终端上打印输出,仅供您检查输出是否正常。
awk '
match([=14=],/$[0-9]+/){
before=substr([=14=],1,RSTART)
value=substr([=14=],RSTART+1,RLENGTH)
rest=substr([=14=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh
第二个解决方案(仅使用较新版本的 GNU awk): 一旦您对上述命令的结果感到满意并且您有gawk
命令然后尝试执行以下操作,这应该将输出保存到 Input_file(s) 本身。恕我直言,这需要 gawk
4.1.0 + 版本。
awk -i inplace -v INPLACE_SUFFIX=.bak '
match([=15=],/$[0-9]+/){
before=substr([=15=],1,RSTART)
value=substr([=15=],RSTART+1,RLENGTH)
rest=substr([=15=],RSTART+RLENGTH)
if(value<9){
value++
}
print before value rest
}
' *sh