Bash 如何从sh中的文件中获取值? 设置:

Bash 如何从sh中的文件中获取值? 设置:,bash,unix,sh,Bash,Unix,Sh,文件a包含: 22 12 文件b包含: 22 12 我有shell脚本1.sh: #!/bin/sh a=$(< a) b=$(< b) echo $(($a*$b)) > c 发生此错误的原因是变量$a和$b没有从文件a和b中获取值 如果Iecho$a和echo$b则不返回任何内容 如果我在脚本中定义a=22和b=12值,那么它就可以工作 我还尝试了其他获取文件内容的方法,比如a=$(

文件
a
包含:

22
12
文件
b
包含:

22
12
我有shell脚本
1.sh

#!/bin/sh

a=$(< a)
b=$(< b)
echo $(($a*$b)) > c
发生此错误的原因是变量
$a
$b
没有从文件
a
b
中获取值

  • 如果I
    echo$a
    echo$b
    则不返回任何内容
  • 如果我在脚本中定义
    a=22
    b=12
    值,那么它就可以工作
  • 我还尝试了其他获取文件内容的方法,比如
    a=$(<'a')
    a=$(
    a=$(
    ),甚至
    a=$(
    )。这些都不起作用
情节扭曲: 但是,如果我将shebang行更改为
#/bin/bash
以便使用bashshell——它可以工作

问题:
如何正确地从sh中的文件中获取数据?

有很多方法。一种明显的方法是通过命令替换在子进程中插入管道:

./1.sh: 5: ./1.sh: arithmetic expression: expecting primary: "*"
A=$(cat fileA.txt)   # 22
B=$(cat fileB.txt)   # 12
echo $((A*B))
# <do it in your head!>

忽略文件a和b中的所有内容,但数字除外:

#!/bin/sh

a=$(tr -cd 0-9 < a)
b=$(tr -cd 0-9 < b)
echo $(($a*$b))
#/垃圾箱/垃圾箱
a=$(tr-CD0-9

请参阅:
man-tr

如果您希望与Bash的模拟相比实现“真正”的Bourne Shell兼容性,那么您必须走老路:

#!/bin/sh
a=`cat a`
b=`cat b`
expr $a \* $b > c
我在
#下尝试了您最初的示例/bin/sh
在macOS和Linux(FC26)上运行,并且假设
a
b
具有UNIX行结尾,则其行为正常。如果不能保证,您需要在
下运行/bin/sh
(由
bash
模拟),然后类似的操作将起作用:

#!/bin/sh
a=$(<a)
b=$(<b)
echo $(( ${a%%[^0-9]*} * ${b%%[^0-9]*} )) > c
#/垃圾箱/垃圾箱

a=$(将
hextump-ca
hextump-cb
的输出添加到您的问题中。
$(
是一个Bash扩展名。对于POSIX sh,
$(cat文件)
则会告诉您“警告(SC2039):在POSIX sh中,$(也可以只做
echo$((a*b))
。注意进程替换(
即使是最古老的shell也支持用
$(…)
代替反勾号进行命令替换。你必须回到几十年前才能找到一个不支持的。POSIX肯定支持它。另一方面,即使
/bin/sh
是Bash,它也不支持
$(第一点,在Solaris 2.10上尝试/sbin/sh;第二点,在Fedora 26上尝试/bin/sh。