[英]bash scripting - how to process a comma separated list as input parameters to a function
我試圖弄清楚如何將逗號分隔的列表作為輸入傳遞,
並讓我的函數一次處理一個值。
我的功能:
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
}
我像這樣運行我的腳本:
./myscript.sh -m add -a pizzahut -i 123.456.790.007,123.456.790.008
我的代碼正在進行中:
#!/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=${OPTARG}
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
但是,我在調用該函數時遇到的問題是將值作為單個字符串插入:
"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 列表,因此實際上類似於:
_ip="123.456.790.007,123.456.790.008"
您需要將列表拆分為,
並用引號將每個 IP 包裝起來,然后再將其提供給 Mongo 的$each
運算符。
首先,將IFS
重定義僅本地化為read
命令,然后利用printf
在提供更多參數時重用相同格式字符串的行為(擴展數組"${arr[@]}"
),將結果存儲到變量通過-v
選項,並從結果中去除前導,
:
IFS=, read -a arr <<<"${_ip}"
printf -v ips ',"%s"' "${arr[@]}"
ips="${ips:1}"
對於上面給出的_ip
值,此腳本將存儲在ips
變量中:
"123.456.790.007","123.456.790.008"
因此,將此應用於您的程序,首先更改您的i)
案例,例如:
case "${o}" in
# ...
i) _ip=${OPTARG};;
esac
然后修復addToWhitelist
函數:
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=$(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.