我想找出可能非常简单的问题的答案:我想将带有空格的带引号的字符串作为函数的独立参数传递。
以下文件包含数据(例如):
one
two three
four five six
seven
还有2个简单函数的脚本:
params_checker()
{
local first_row="$1"
local second_row="$2"
local third_row="$3"
echo "Expected args are:${first_row} ; ${second_row} ; ${third_row}"
echo "All args are:"
for arg in "$@"; do
echo "${arg}"
done
}
read_from_file()
{
local args_string
while read line; do
args_string="${args_string} \"${line}\""
echo "Read row: ${line}"
done < ./test_input
params_checker ${args_string}
}
read_from_file
换句话说,我想从文本文件中获取行作为函数 params_checker 的参数(文件中的每一行作为不同的参数,我需要在行中保留空格)。尝试使用带引号的“substrings”组合字符串失败,输出为:
~/test_sh$ sh test_process.sh
Read row: one
Read row: two three
Read row: four five six
Read row: seven
Expected args are:"one" ; "two ; three"
All args are:
"one"
"two
three"
"four
five
six"
"seven"
期望是1美元=“一”,2美元=“两三”,3美元=“四五六”...... 在传递给params_checker期间引用$ {args_string}给出了另一个结果,字符串作为单个参数传递。
请你帮忙找出正确的方法,如何通过文件中的空格传递这些字符串作为不同的独立函数论证?
非常感谢您的帮助!
答案 0 :(得分:1)
在bash / ksh / zsh中你使用数组。在sh
中,您可以使用参数&#34; $ 1&#34;,&#34; $ 2&#34;等:
read_from_file()
{
set -- # Clear parameters
while read line; do
set -- "$@" "$line" # Append to the parameters
echo "Read row: ${line}"
done < ./test_input
params_checker "$@" # Pass all parameters
}
答案 1 :(得分:0)
你去了,这应该给你你想要的东西:
#!/bin/bash
params_checker()
{
local first_row="$1"
local second_row="$2"
local third_row="$3"
local forth_row="$4"
echo "Expected args are: ${first_row} ; ${second_row} ; ${third_row} ; ${forth_row}"
echo "All args are:"
for i in "$@"
do
echo "$i"
done
}
read_from_file()
{
ARRAY=()
while read line; do
echo "Read row: ${line}"
ARRAY+=("$line")
done < ./test_input
params_checker "${ARRAY[@]}"
}
read_from_file;
这应该在BASH中运作良好。如果您的文件名为test.sh,则可以像这样运行./test.sh