我需要使用 bash 对文件的行和数字进行一些数学运算。就像在 Ruby 或 Python 中一样,您可以轻松地将字符串转换为数字,反之亦然。在 bash 中,所有内容都是无类型的。
我有一个包含这样的数字的文件:1,2,3 我可以迭代它并返回恰好 2。
cat file.txt | sed 's/[^,]//g' | wc -c
我想将这个结果存储在 $ 变量中,并添加一个固定数字 ((3+1))。例如$total = 2 + 3 + 1 = 6。如何将unix命令的结果存储在变量中以供进一步使用?
number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )
echo "elements are: $number_of_elements" #2
lines = $(( $number_of_elements + 3 + 1)) & echo "lines are: $lines " #2+3+1
cat file.txt | grep -A $lines "text " > output.txt #open file, grep the "text" and the 6 lines that come after.
似乎存在问题: - 未找到第 1 / 3 行命令 - 作为结果 grep 它不适用于 $lines
答案1
您需要命令替换$()
:
variable=$(sed 's/[^,]//g' file.txt | wc -c)
现在您可以使用 获取变量引用的值$variable
。请注意,在扩展时引用变量几乎总是一个好主意,以避免意外效果(分词和路径名扩展),因此最好使用"$variable"
.
请注意,我已删除cat file.txt
assed
采用文件名作为参数。
答案2
编辑二: 你可以不是当你分配一个变量时,Bash 中有空格。这(来自你的帖子):
number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )
...不管用。但这会:
number_of_elements=$( sed 's/[^,]//g' elements.txt | wc -c )
删除标志前后的空格=
。请阅读@heemayl关于如何使用命令替换的写得很好(并得到好评)的答案!
我想将这个结果存储在 $ 变量中,并添加一个固定数字 ((3+1))。例如$total = 2 + 3 + 1 = 6。如何将unix命令的结果存储在变量中以供进一步使用?
像这样的东西:
myVar=2
total=$(($myVar+2+3+1))
echo $total
8
这里,使用变量$myVar
(包含整数2
),然后我们添加整数2
,3
然后1
将其保存在新变量中$total
。
答案3
number_of_elements = $( sed 's/[^,]//g' elements.txt | wc -c )
将尝试运行该number_of_elements
命令,=
并将 split+glob 的结果wc
作为参数应用于命令的输出。在类似 Bourne 的 shell 中,标量变量赋值时var=value
周围没有空格字符=
(var
也必须是文字并且是有效的变量名称)。
另请注意,该sed
命令将删除除,
、换行符和不构成 中有效字符一部分的字节之外的所有内容elements.txt
。
如果你只想计算,
字符数,你可以这样做:
count=$(tr -cd , < elements.txt | wc -c)
对于,
和换行符:
count=$(tr -cd ',\n' < elements.txt | wc -c)
(但请注意,在某些wc
实现中,$count
可能会有一些前导或尾随空白)。
添加一些数字:
count=$(($(tr -cd , < elements.txt | wc -c) + 1))
的内容$((...))
被视为如同内部"..."
:仍然执行参数扩展、算术扩展和命令替换。要去除上面提到的额外空白,您实际上可以这样做:
count=$(($(... | wc -c)))
代替:
count=$(... | wc -c)