Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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

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函数中本地更改IFS吗?_Bash_Shell_Local_Ifs - Fatal编程技术网

可以在Bash函数中本地更改IFS吗?

可以在Bash函数中本地更改IFS吗?,bash,shell,local,ifs,Bash,Shell,Local,Ifs,我有一个函数需要更改IFS的逻辑: my_func() { oldIFS=$IFS; IFS=.; var="$1"; arr=($var); IFS=$oldIFS # more logic here } 我是否可以在函数内将IFS声明为本地IFS,这样我就不必担心备份其当前值和以后恢复?是的,可以定义它 只要将其定义为本地,函数中的值设置就不会影响全局IFS值。请参见下面代码段之间的差异 addNumbers () { local IFS='+' printf "%

我有一个函数需要更改IFS的逻辑:

my_func() {
  oldIFS=$IFS; IFS=.; var="$1"; arr=($var); IFS=$oldIFS
  # more logic here
}
我是否可以在函数内将IFS声明为本地IFS,这样我就不必担心备份其当前值和以后恢复?

是的,可以定义它

只要将其定义为本地,函数中的值设置就不会影响全局IFS值。请参见下面代码段之间的差异

addNumbers () {
    local IFS='+'
    printf "%s\n" "$(( $* ))"
}
在命令行中作为调用时

addNumbers 1 2 3 4 5 100
115

nos=(1 2 3 4 5 100)
echo "${nos[*]}"
从命令行。上述echo输出上的hextump不会显示函数中定义的IFS值

echo "${nos[*]}" | hexdump -c
0000000   1       2       3       4       5       1   0   0  \n
000000e
在我的一个答案中,可以看到我如何使用本地化的IFS进行算术-

是的,它可以定义

只要将其定义为本地,函数中的值设置就不会影响全局IFS值。请参见下面代码段之间的差异

addNumbers () {
    local IFS='+'
    printf "%s\n" "$(( $* ))"
}
在命令行中作为调用时

addNumbers 1 2 3 4 5 100
115

nos=(1 2 3 4 5 100)
echo "${nos[*]}"
从命令行。上述echo输出上的hextump不会显示函数中定义的IFS值

echo "${nos[*]}" | hexdump -c
0000000   1       2       3       4       5       1   0   0  \n
000000e

在我的一个答案中,可以看到我是如何使用本地化的IFS进行算术运算的-

它似乎可以按照您的意愿工作

#!/bin/bash
changeIFSlocal() {
    local IFS=.
    echo "During local: |$IFS|"
}
changeIFSglobal() {
    IFS=.
    echo "During global: |$IFS|"
}
echo "Before: |$IFS|"
changeIFSlocal
echo "After local: |$IFS|"
changeIFSglobal
echo "After global: |$IFS|"
这张照片是:

Before: |
|
During local: |.|
After local: |
|
During global: |.|
After global: |.|

它似乎能按你的愿望工作

#!/bin/bash
changeIFSlocal() {
    local IFS=.
    echo "During local: |$IFS|"
}
changeIFSglobal() {
    IFS=.
    echo "During global: |$IFS|"
}
echo "Before: |$IFS|"
changeIFSlocal
echo "After local: |$IFS|"
changeIFSglobal
echo "After global: |$IFS|"
这张照片是:

Before: |
|
During local: |.|
After local: |
|
During global: |.|
After global: |.|
可以将IFS指定为局部变量;本地版本仍然用作字段分隔符字符串

有时,在完全隔离的环境中运行函数是有用的,在这种环境中,没有永久性的更改。例如,如果函数需要更改shell选项。这可以通过使函数在子shell中运行来实现;只需将函数定义中的{}更改为:

可以将IFS指定为局部变量;本地版本仍然用作字段分隔符字符串

有时,在完全隔离的环境中运行函数是有用的,在这种环境中,没有永久性的更改。例如,如果函数需要更改shell选项。这可以通过使函数在子shell中运行来实现;只需将函数定义中的{}更改为:


我感到困惑,因为我在函数中未使用local将IFS的值更改为:inner,然后在调用函数后,尝试使用此命令显示IFS的值:

echo $IFS
它显示了一条空行,让我觉得函数没有改变IFS。发帖后,我意识到分词的作用,我应该使用

echo "$IFS"

或者,甚至更好

set | grep -w IFS=
以准确显示IFS值

回到局部变量的主要主题,是的,任何变量都可以在函数中声明为局部变量以限制作用域,但使用readonly或declare-r内置命令声明为readonly的变量除外。这包括Bash变量,如Bash_VERSINFO等

从本地帮助:

本地:本地[选项]名称[=值]。。。
我感到困惑,因为我在函数中未使用local将IFS的值更改为:inner,然后在调用函数后,尝试使用此命令显示IFS的值:

echo $IFS
它显示了一条空行,让我觉得函数没有改变IFS。发帖后,我意识到分词的作用,我应该使用

echo "$IFS"

或者,甚至更好

set | grep -w IFS=
以准确显示IFS值

回到局部变量的主要主题,是的,任何变量都可以在函数中声明为局部变量以限制作用域,但使用readonly或declare-r内置命令声明为readonly的变量除外。这包括Bash变量,如Bash_VERSINFO等

从本地帮助:

本地:本地[选项]名称[=值]。。。
为什么不在调用函数时才更改IFS的值呢?如果=。my_func some argI不希望调用方承担该责任,以便调用方和被调用方之间没有耦合。为什么不仅在调用函数时更改IFS的值?如果=。my_func some argI不希望调用方承担该责任,以便调用方和被调用方之间没有耦合。