我正在搜索一个命令,它将所有给定参数与特定分隔符分开,并输出它们。
示例(分隔符设置为冒号:
):
somecommand "this is" "a" test
应输出
"this is":"a":"test"
我知道shell在将参数传递给命令之前解释了引号。那么命令应该实际做的是打印出引号中的每个给定参数,并用冒号分隔所有这些参数。
我也不寻求仅限bash的解决方案,但寻求最优雅的解决方案。
只需循环遍历这些元素的数组就可以了,但问题是我必须在gnu makefile
中使用它,它只允许单行shell命令并使用它sh
代替bash
。
越简单越好。
答案 0 :(得分:4)
怎么样
somecommand () {
printf '"%s"\n' "$@" | paste -s -d :
}
使用printf
添加引号并在单独的行上打印每个条目,然后使用带有paste
(“serial”)选项的-s
和冒号作为分隔符。< / p>
可以像这样调用:
$ somecommand "this is" "a" test
"this is":"a":"test"
答案 1 :(得分:3)
如许多评论所示,一个简单的&#34; 循环&#34;方法,循环遍历作为参数传递的每个字符串是一种非常直接的方法来接近它:
delimit_colon() {
local first=1
for i in "$@"; do
if [ "$first" -eq 1 ]; then
printf "%s" "$i"
first=0
else
printf ":%s" "$i"
fi
done
printf "\n"
}
当与简短的测试脚本结合使用时,可能是:
#!/bin/bash
delimit_colon() {
local first=1
for i in "$@"; do
if [ "$first" -eq 1 ]; then
printf "%s" "$i"
first=0
else
printf ":%s" "$i"
fi
done
printf "\n"
}
[ -z "$1" ] && { ## validate input
printf "error: insufficient input\n"
exit 1
}
delimit_colon "$@"
exit 0
测试输入/输出
$ bash delimitargs.sh "this is" "a" test
this is:a:test
答案 2 :(得分:2)
apply_delimiter () {
(( $# )) || return
local res
printf -v res '"%s":' "$@"
printf '%s\n' "${res%:}"
}
用法示例:
$ apply_delimiter hello world "how are you"
"hello":"world":"how are you"
答案 3 :(得分:1)
这是使用z-shell的解决方案:
#!/usr/bin/zsh
# this is "somecommand"
echo '"'${(j_":"_)@}'"'
答案 4 :(得分:-2)
如果已经有数组,可以使用此命令
MYARRAY=("this is" "a" "test")
joined_string=$(IFS=:; echo "$(MYARRAY[*])")
echo $joined_string
设置IFS(内部字段分隔符)将是字符分隔符。在阵列上使用echo将使用新设置的IFS显示阵列。将这些命令放在$()中会将echo的输出放入joined_string。