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=$(
#/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。