Linux中从文件中读取参数到拼接到命令行中

示例:

1. 如所需的可执行命令的格式:

str2str是一个可执行文件,后面有两个参数 -in 和 -out

./str2str -in ntrip://zy:[email protected]:8080/ABCDEFG -out udpcli://123.249.112.13:8090

-in 和 -out 后面的参数在一个文本文件中,需要从文本文件中读取出来,然后自动拼接成一条命令:

2.文本文件(config.txt)中存放的内容如下:

可以看到文件中,每一个参数都是用逗号(,)分隔的,所以我们可以按行读取该文本文件,并以逗号为分隔符,获取每一行的每一个参数。

/ABCDEFH,123.249.112.10,8080,zy,123456,123.249.112.13,8090
/ABCDEFG,123.249.112.11,8080,zy,123456,123.249.112.13,8091
...
...
/ABCDEFI,123.249.112.12,8080,zy,123456,123.249.112.13,8092

对应的脚本文件如下:

#!/bin/bash

# 程序路径
EXEC_PATH=./str2str

# 配置文件路径
CONFIG_PATH=./config.txt

# 命令列表
commands=()
while read line
do
  # 分割字段
  fields=(${line//,/ })

  # 获取ntrip服务器的地址、端口、用户名和密码
  ntrip_ip=${fields[1]}
  ntrip_port=${fields[2]}
  ntrip_user=${fields[3]}
  ntrip_password=${fields[4]}

  # 构造输入参数,格式为 ntrip://[username]:[password]@[ip]:[port]/[mountpoint]
  in_param="ntrip://$ntrip_user:$ntrip_password@$ntrip_ip:$ntrip_port${fields[0]}"

  # 获取输出UDP服务器的地址和端口
  udp_ip=${fields[5]}
  udp_port=${fields[6]}

  # 构造输出参数,格式为 udpcli://[ip]:[port]
  out_param="udpcli://$udp_ip:$udp_port"

  # 构造命令
  command="$EXEC_PATH -in $in_param -out $out_param"

  # 添加到命令列表 使用 nohup 命令将每个命令放在子 shell 中运行,使其在后台运行,并且将标准输出        
  #和标准错误输出重定向到 /dev/null,忽略输出信息
  commands+=("nohup sh -c \"$command\" >/dev/null 2>&1 &")

done < $CONFIG_PATH

# 依次执行命令列表
for cmd in "${commands[@]}"
do
  eval $cmd
done

代码解释:

(1)丢弃输出

nohup bash -c "$cmd" >/dev/null 2>&1 &

>/dev/null 是一种常见的输出重定向操作,将标准输出(stdout)输出到 /dev/null 设备中,从而实现将输出丢弃的目的。

2>&1 是一个 shell 的 I/O 重定向语法,表示将标准错误输出(stderr)也重定向到标准输出(stdout),使得所有的输出都会被输出到 >/dev/null,也就是丢弃输出。

具体来说,2表示标准错误输出的文件描述符,&表示与标准输出一样,1表示标准输出的文件描述符。所以,2>&1 表示将标准错误输出重定向到标准输出。

(2)依次执行命令列表

for cmd in "${commands[@]}":

遍历数组 commands,每次循环将数组中的一个元素赋值给变量 cmd。

eval $cmd:使用 eval 命令执行变量 $cmd 中存储的命令。

eval 命令会解析命令中的变量和特殊字符,然后执行该命令。 使用 eval 命令可以在运行命令时动态地将变量的值传递给命令,从而实现将命令字符串转换为可执行命令的功能。

清空一个文件的命令:

echo "" > config.txt

猜你喜欢

转载自blog.csdn.net/weixin_49561506/article/details/130123863