Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本-如何处理逗号分隔的列表作为函数的输入参数_Bash_Unix_Scripting_Getopts - Fatal编程技术网

bash脚本-如何处理逗号分隔的列表作为函数的输入参数

bash脚本-如何处理逗号分隔的列表作为函数的输入参数,bash,unix,scripting,getopts,Bash,Unix,Scripting,Getopts,我试图弄清楚如何将逗号,分隔列表作为输入传递,并让函数一次处理一个值 我的职能: addToWhitelist () { host='127.0.0.1' db='mytest' _mongo=$(which mongo); echo "${_ip}"; read -a arr <<<${_ip}; for i in ${arr[@]}; do exp="db.account.update({\"account\":'${_a

我试图弄清楚如何将逗号
分隔列表作为输入传递,并让函数一次处理一个值

我的职能:

addToWhitelist ()
{
   host='127.0.0.1'
   db='mytest'
   _mongo=$(which mongo);
   echo "${_ip}";
   read -a arr <<<${_ip};
   for i in ${arr[@]};
   do
     exp="db.account.update({\"account\":'${_account}'},{\$addToSet:{\"ip_list\": {\$each:['${_ip}'] }}})";
     ${_mongo} ${host}/${db} --eval "$exp"
   done
}
addToWhitelist() {
    host='127.0.0.1'
    db='mytest'
    _mongo=$(which mongo)
    IFS=, read -a arr <<<"${_ip}"
    printf -v ips ',"%s"' "${arr[@]}"
    ips="${ips:1}"
    exp="db.account.update({'account': '${_account}'}, {\$addToSet:{'ip_list': {\$each:[$ips]}}})";
    "${_mongo}" "${host}/${db}" --eval "$exp"
}
但是,调用该函数时遇到的问题是,将值作为单个字符串插入:

  "ip_list" : [
    "123.456.790.006",
    "123.456.790.007,123.456.790.008",
    "123.456.790.009"
  ]
}
期望:

  "ip_list" : [
    "123.456.790.006",
    "123.456.790.007",
    "123.456.790.008",
    "123.456.790.009"
  ]
}
试试下面

ip=$(echo${OPTARG}| sed“s/,/,\n/g”)

所以完整的剧本是这样的

#!/usr/local/bin/bash
set -e
set -x

# Usage for getopts
usage () {
    echo "Example: $0 -m find -a pizzahut"
    echo "Example: $0 -m add -a pizzahut -i 10.10.123.456"
    exit 1;
}

while getopts ":m:a:i:" o; do
  case "${o}" in
    m)
    _mode=${OPTARG}
         if [[ "${_mode}" != find && "${_mode}" != add ]]; then
        usage
        fi
    ;;
    a)
    _account=${OPTARG}
    ;;
     i)
    _ip=$(echo ${OPTARG}|sed "s/,/,\n/g")
        set -f
        IFS=,
    ;;
    *)
       usage
       ;;
  esac
done
shift $((OPTIND-1))
getWhitelist ()
{
   host='127.0.0.1'
   db='mytest'
   _mongo=$(which mongo);
   exp="db.account.find({\"account\":'${_account}'},{ip_list: 1}).pretty();";
   ${_mongo} ${host}/${db} --eval "$exp"
}

# Read a list
addToWhitelist ()
{
   host='127.0.0.1'
   db='mytest'
   _mongo=$(which mongo);
   echo "${_ip}";
   read -a arr <<<${_ip};
   for i in ${arr[@]};
   do
   exp="db.account.update({\"account\":'${_account}'},{\$addToSet:{\"ip_list\": {\$each:['${_ip}'] }}})";
     ${_mongo} ${host}/${db} --eval "$exp"
   done
}


case "${_mode}" in
  'find')
      echo "Finding information for the account ${_account}"
      getWhitelist
      ;;
  'add')
   echo "Adding the following IP: ${_ip}"
      addToWhitelist
      ;;
esac

set +x
#/usr/local/bin/bash
set-e
集合x
#getopts的用法
用法(){
echo“示例:$0-m find-a pizzahut”
echo“示例:$0-m添加-a pizzahut-i 10.10.123.456”
出口1;
}
而getopts:m:a:i:o;做
中的大小写“${o}”
m)
_模式=${OPTARG}
如果[[“${u mode}”!=find&&“${u mode}”!=add]];然后
使用
fi
;;
(a)
_帐户=${OPTARG}
;;
(一)
_ip=$(echo${OPTARG}| sed“s/,/,\n/g”)
set-f
如果=,
;;
*)
使用
;;
以撒
完成
班次$((可选ND-1))
getWhitelist()
{
host='127.0.0.1'
db='mytest'
_mongo=$(哪个mongo);
exp=“db.account.find({\'account\':'${u account}',{ip_list:1}).pretty();”;
${u mongo}${host}/${db}--eval“$exp”
}
#读一份清单
AddToHitelist()
{
host='127.0.0.1'
db='mytest'
_mongo=$(哪个mongo);
回声“${ip}”;

read-a arr因为脚本接收到一个逗号分隔的IP列表,实际上类似于:

_ip="123.456.790.007,123.456.790.008"
在将列表交给Mongo的
$each
操作员之前,您需要按
拆分列表,并用引号将每个IP括起来

首先,将
IFS
的重新定义本地化为
read
命令,然后利用
printf
在提供更多参数时重用相同格式字符串的行为(扩展数组
“${arr[@]}”
),通过
-v
选项将结果存储到变量中,并从结果中去除前导的

IFS=, read -a arr <<<"${_ip}"
printf -v ips ',"%s"' "${arr[@]}"
ips="${ips:1}"

因此,将其应用到程序中,首先更改
i)
的大小写,如:

case "${o}" in
    # ...
    i) _ip=${OPTARG};;
esac
然后修复
addToWhitelist
功能:

addToWhitelist ()
{
   host='127.0.0.1'
   db='mytest'
   _mongo=$(which mongo);
   echo "${_ip}";
   read -a arr <<<${_ip};
   for i in ${arr[@]};
   do
     exp="db.account.update({\"account\":'${_account}'},{\$addToSet:{\"ip_list\": {\$each:['${_ip}'] }}})";
     ${_mongo} ${host}/${db} --eval "$exp"
   done
}
addToWhitelist() {
    host='127.0.0.1'
    db='mytest'
    _mongo=$(which mongo)
    IFS=, read -a arr <<<"${_ip}"
    printf -v ips ',"%s"' "${arr[@]}"
    ips="${ips:1}"
    exp="db.account.update({'account': '${_account}'}, {\$addToSet:{'ip_list': {\$each:[$ips]}}})";
    "${_mongo}" "${host}/${db}" --eval "$exp"
}
addToHitelist(){
host='127.0.0.1'
db='mytest'
_mongo=$(哪个mongo)

IFS=,read-a arr谢谢你的回复。我试过了,但是运气不好。我
echo
查看输出,它仍然是一样的。
123.456.790.007123.456.790.008
你能试试
echo-e${OPTARG}sed“s/,\n/g”
?这是我用
echo-e${OPTARG sed“s/,\n/g”输出的结果
123.456.790.016,n123.456.790.017
哇!非常感谢您在这方面的帮助。使用
printf
是一个很好的处理方法。我感谢您的帮助!