如何为-p
传递给函数的每个参数添加前缀?
修改参数本身和创建新数组都可以。
答案1
即使对于带有空格或更糟糕的复杂参数,这也应该能很好地工作:
#!/bin/bash
new_args=()
for arg
do
new_args+=( '-p' )
new_args+=( "$arg" )
done
for arg in "${new_args[@]}"
do
echo "$arg"
done
测试:
$ ~/test.sh foo $'bar\n\tbaz bay'
-p
foo
-p
bar
baz bay
答案2
${ARGS[@]/#/-p }
如果将IFS
变量设置为空字符串,则可以保留扩展中的空格!
# sample code
(
set -- 1 2 3 'arg with spaces' $'bar\n\tbaz bay'
printf 'oldIFS: %q\n' "$IFS"
IFS=""
#IFS=" "
printf 'newIFS: %q\n' "$IFS"
ARGS=("$@")
ARGS=( ${ARGS[@]/#/-p } )
for ((i=0; i < ${#ARGS[@]}; i++)); do
echo "$i: ${ARGS[i]}"
done
)
在函数内部,您可以IFS
使用 来将修改变量的范围限制到该函数declare IFS=""
。
答案3
将参数放入数组中并使用bash 模式替换对它们进行数组替换和前缀匹配:
ARGS=("$@")
echo ${ARGS[@]/#/-p }
这会将每个参数的开头替换为-p<space>
.
不幸的是,如果你的参数中有空格,这将无法正常工作。使用 时可以正确保留空格ARGS=("$@")
,但在进行扩展时则不会${ARGS[@]/#/-p }
。您可以在该扩展周围添加双引号,但您会得到-p arg1
一个参数,而不是两个参数。
如果您不需要-p<space>
前置,那么只需-p
在扩展周围加上双引号就可以了。尝试在扩展周围使用或不使用双引号,看看哪种最适合您。