相关疑难解决方法(0)

我刚刚分配了一个变量,但echo $ variable显示了其他内容

以下是一系列echo $var可以显示与刚刚分配的值不同的值的情况.无论指定的值是"双引号","单引号"还是不引用,都会发生这种情况.

如何让shell正确设置我的变量?

星号

预期的输出是/* Foobar is free software */,但我得到一个文件名列表:

$ var="/* Foobar is free software */"
$ echo $var 
/bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...
Run Code Online (Sandbox Code Playgroud)

方括号

期望值是[a-z],但有时我会得到一个字母!

$ var=[a-z]
$ echo $var
c
Run Code Online (Sandbox Code Playgroud)

换行(换行符)

预期值是一个单独的行列表,但所有值都在一行!

$ cat file
foo
bar
baz

$ var=$(cat file)
$ echo $var
foo bar baz
Run Code Online (Sandbox Code Playgroud)

多个空间

我期望一个精心对齐的表头,但是多个空格要么消失要么折叠成一个!

$ var="       title     |    count"
$ echo $var
title | count
Run Code Online (Sandbox Code Playgroud)

标签

我期望两个制表符分隔值,但我得到两个空格分隔值!

$ …
Run Code Online (Sandbox Code Playgroud)

bash shell sh quoting

87
推荐指数
4
解决办法
15万
查看次数

Bash中的单词拆分,IFS设置为非空白字符

我正在阅读Bash 教程,特别是单词分裂的主题.

这个名为"args"的脚本有助于演示单词拆分示例:

#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
Run Code Online (Sandbox Code Playgroud)

一个例子:

$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我理解这是如何工作的.

但是,当我用非空白字符替换IFS时,:如果我直接将字符串作为参数传递,则脚本不会执行分词.

$ ./args one:two:three
1 args: <one:two:three>
Run Code Online (Sandbox Code Playgroud)

但是,如果I(1)将字符串分配给变量,然后(2)通过参数扩展将字符串传递给脚本,则脚本会对同一字符串执行分词.

$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>
Run Code Online (Sandbox Code Playgroud)

为什么?具体来说,当IFS未设置且分隔符是空白字符时,为什么传递字符串作为参数会进行单词拆分,但是当IFS设置为非空白字符时却不会?

当我使用read而不是这个脚本时,相同的字符串也会按预期进行单词拆分.

$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two …
Run Code Online (Sandbox Code Playgroud)

bash split variable-expansion ifs

7
推荐指数
1
解决办法
869
查看次数

标签 统计

bash ×2

ifs ×1

quoting ×1

sh ×1

shell ×1

split ×1

variable-expansion ×1