【问题标题】:Increment input Variable Number in shell Script在 shell 脚本中增加输入变量号
【发布时间】:2020-04-01 17:41:43
【问题描述】:

我有很多脚本在其中读取输入参数。我需要将所有输入参数增加 1。因此,如果它为 1,则它需要为 2 和 2 需要为 3,等等。是否有任何 unix 命令可以一次性替换所有脚本,而不是转到每个脚本并手动进行。我是 Unix 新手,不确定是否有任何方法可以做到这一点。下面是示例。感谢您对此的任何帮助。

改动前

#!/bin/ksh
hv_bus_date="CAST('$1' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$2
hv_act_id=$3

改动后

​​>
#!/bin/ksh
hv_bus_date="CAST('$2' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$3
hv_act_id=$4

【问题讨论】:

  • 这些脚本是否有可能采用超过 9 个位置参数?
  • 会低于10个参数
  • 然后我会选择printf 's/\$%d/$%d/g\n' {1,{2..8}{,},9} | tac | sed -i -f - file1 file2 ... 之类的东西。不要在没有备份输入的情况下尝试这个,它并不可靠
  • 嗨 Oguz,我尝试在多个文件上使用它……它正在工作。感谢您的回复。

标签: awk sed replace numbers increment


【解决方案1】:

编辑:要在没有 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($0,/\$[0-9]+/){
  before=substr($0,1,RSTART)
  value=substr($0,RSTART+1,RLENGTH)
  rest=substr($0,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('$1' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$2
hv_act_id=$3

之后:

cat file1.ksh
hv_bus_date="CAST('$2' AS DATE FORMAT 'YYYYMMDD')"
hv_octs_sys_wid=$3
hv_act_id=$4


第一个解决方案:考虑到您的脚本名称以 .sh 扩展名结尾,并且这不会将输出保存到 Input_file(s),您能否尝试以下操作,它会在终端上打印输出,仅供您检查输出是否正常。

awk '
match($0,/\$[0-9]+/){
  before=substr($0,1,RSTART)
  value=substr($0,RSTART+1,RLENGTH)
  rest=substr($0,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($0,/\$[0-9]+/){
  before=substr($0,1,RSTART)
  value=substr($0,RSTART+1,RLENGTH)
  rest=substr($0,RSTART+RLENGTH)
  if(value<9){
    value++
  }
  print before value rest
}
' *sh

【讨论】:

  • 嗨,Ravinder,我通过放置正确的文件进行了尝试,现在它正在工作..非常感谢您的及时回复。
  • @RameshS,顺便说一句,感谢您提出这个问题,我也会记下这个 EDIT 程序,因为它也没有 GNU awk,干杯。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2021-08-22
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2018-09-25
相关资源
最近更新 更多