Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在shell脚本中将带有特殊字符的参数传递给函数_Bash_Shell - Fatal编程技术网

Bash 在shell脚本中将带有特殊字符的参数传递给函数

Bash 在shell脚本中将带有特殊字符的参数传递给函数,bash,shell,Bash,Shell,我有一个函数,我向它传递的参数如下。。(从文本文件中的一行读取) 但是函数将整个字符串作为一个参数my_proj-x build,而不是给我$1=my_proj,$2=-x,$3=build,这样我就可以根据参数执行一些操作 关于如何使shell脚本以这种方式运行,有什么建议吗 编辑:以下是代码段(从OP的评论中添加): 区别在于调用函数的位置 调用函数时,不要以双引号传递参数,在这种情况下,带空格的整个字符串被视为单个实体 而不是没有双引号的通行证 测试 $ fun() > { >

我有一个函数,我向它传递的参数如下。。(从文本文件中的一行读取)

但是函数将整个字符串作为一个参数
my_proj-x build
,而不是给我
$1=my_proj,$2=-x,$3=build
,这样我就可以根据参数执行一些操作

关于如何使shell脚本以这种方式运行,有什么建议吗

编辑:以下是代码段(从OP的评论中添加):


区别在于调用函数的位置

调用函数时,不要以双引号传递参数,在这种情况下,带空格的整个字符串被视为单个实体

而不是没有双引号的通行证

测试

$ fun()
> {
> echo $1, $2, $3
> }

# Calling the function without double quotes
$ fun my_proj -x build
my_proj, -x, build

# Calling the function with double quotes
$ fun "my_proj -x build"
my_proj -x build, ,
$ 
如果将变量传递给函数

$ var="my_proj -x build"
$ fun $var
my_proj, -x, build
$ fun "$var"
my_proj -x build, ,

区别在于调用函数的位置

调用函数时,不要以双引号传递参数,在这种情况下,带空格的整个字符串被视为单个实体

而不是没有双引号的通行证

测试

$ fun()
> {
> echo $1, $2, $3
> }

# Calling the function without double quotes
$ fun my_proj -x build
my_proj, -x, build

# Calling the function with double quotes
$ fun "my_proj -x build"
my_proj -x build, ,
$ 
如果将变量传递给函数

$ var="my_proj -x build"
$ fun $var
my_proj, -x, build
$ fun "$var"
my_proj -x build, ,

区别在于调用函数的位置

调用函数时,不要以双引号传递参数,在这种情况下,带空格的整个字符串被视为单个实体

而不是没有双引号的通行证

测试

$ fun()
> {
> echo $1, $2, $3
> }

# Calling the function without double quotes
$ fun my_proj -x build
my_proj, -x, build

# Calling the function with double quotes
$ fun "my_proj -x build"
my_proj -x build, ,
$ 
如果将变量传递给函数

$ var="my_proj -x build"
$ fun $var
my_proj, -x, build
$ fun "$var"
my_proj -x build, ,

区别在于调用函数的位置

调用函数时,不要以双引号传递参数,在这种情况下,带空格的整个字符串被视为单个实体

而不是没有双引号的通行证

测试

$ fun()
> {
> echo $1, $2, $3
> }

# Calling the function without double quotes
$ fun my_proj -x build
my_proj, -x, build

# Calling the function with double quotes
$ fun "my_proj -x build"
my_proj -x build, ,
$ 
如果将变量传递给函数

$ var="my_proj -x build"
$ fun $var
my_proj, -x, build
$ fun "$var"
my_proj -x build, ,

从你的评论来看:

我正在从文本文件中的一行读取命令,而 该文件现在是我的_proj-x构建,我的脚本将该行读入 变量'var'并调用函数build(){}

我想你想要这个:

使用:

而不是
build$var

或者您可以更改代码以省略
IFS=$'\n'
,以便
build$var
按预期工作。(
$var
需要取消报价)

而是使用while循环:

while IFS= read -r line;do
#do something
done <filepath
而IFS=read-r行;做
#做点什么

完成从您的评论判断:

我正在从文本文件中的一行读取命令,而 该文件现在是我的_proj-x构建,我的脚本将该行读入 变量'var'并调用函数build(){}

我想你想要这个:

使用:

而不是
build$var

或者您可以更改代码以省略
IFS=$'\n'
,以便
build$var
按预期工作。(
$var
需要取消报价)

而是使用while循环:

while IFS= read -r line;do
#do something
done <filepath
而IFS=read-r行;做
#做点什么

完成从您的评论判断:

我正在从文本文件中的一行读取命令,而 该文件现在是我的_proj-x构建,我的脚本将该行读入 变量'var'并调用函数build(){}

我想你想要这个:

使用:

而不是
build$var

或者您可以更改代码以省略
IFS=$'\n'
,以便
build$var
按预期工作。(
$var
需要取消报价)

而是使用while循环:

while IFS= read -r line;do
#do something
done <filepath
而IFS=read-r行;做
#做点什么

完成从您的评论判断:

我正在从文本文件中的一行读取命令,而 该文件现在是我的_proj-x构建,我的脚本将该行读入 变量'var'并调用函数build(){}

我想你想要这个:

使用:

而不是
build$var

或者您可以更改代码以省略
IFS=$'\n'
,以便
build$var
按预期工作。(
$var
需要取消报价)

而是使用while循环:

while IFS= read -r line;do
#do something
done <filepath
而IFS=read-r行;做
#做点什么

完成您评论中显示的代码相当曲折。您遇到的问题是使用
IFS
,这会让您无法进行其他变量扩展<代码>IFS
技术可能有用,但也可能危险。在这种情况下,完全没有必要使用
cat

这对我很有用:

#!/bin/bash

runBuild() {
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
}

while read line
do 
    echo "starting build for $line" 
    runBuild $line 
done < "gash.txt"
输出:

starting build for my_proj -x build
$1: my_proj
$2: -x
$3: build

你评论中的代码相当曲折。您遇到的问题是使用
IFS
,这会让您无法进行其他变量扩展<代码>IFS
技术可能有用,但也可能危险。在这种情况下,完全没有必要使用
cat

这对我很有用:

#!/bin/bash

runBuild() {
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
}

while read line
do 
    echo "starting build for $line" 
    runBuild $line 
done < "gash.txt"
输出:

starting build for my_proj -x build
$1: my_proj
$2: -x
$3: build

你评论中的代码相当曲折。您遇到的问题是使用
IFS
,这会让您无法进行其他变量扩展<代码>IFS
技术可能有用,但也可能危险。在这种情况下,完全没有必要使用
cat

这对我很有用:

#!/bin/bash

runBuild() {
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
}

while read line
do 
    echo "starting build for $line" 
    runBuild $line 
done < "gash.txt"
输出:

starting build for my_proj -x build
$1: my_proj
$2: -x
$3: build

你评论中的代码相当曲折。您遇到的问题是使用
IFS
,这会让您无法进行其他变量扩展<代码>IFS
技术可能有用,但也可能危险。在这种情况下,完全没有必要使用
cat

这对我很有用:

#!/bin/bash

runBuild() {
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
}

while read line
do 
    echo "starting build for $line" 
    runBuild $line 
done < "gash.txt"
输出:

starting build for my_proj -x build
$1: my_proj
$2: -x
$3: build

事实上,我在打电话时没有用双引号。我从一个文本文件中读取命令,文件中的行在这种情况下,您必须提供相关代码,以便从文件中读取行。这将提供额外的信息,事实上我打电话时没有任何双引号。我在读书