在 BASH 中为每个参数添加 -o 前缀

在 BASH 中为每个参数添加 -o 前缀

如何为-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在扩展周围加上双引号就可以了。尝试在扩展周围使用或不使用双引号,看看哪种最适合您。

相关内容