从文件中计数,我不想使用shell / bash打印任何变量

时间:2019-03-25 03:07:49

标签: bash shell

从文件中获取计数,例如,如果count = 5,我想打印5个变量。即A B C D E. 如果count = 2,则打印2个变量A B,等等。

我尝试使用ASCII值,但无法通过。

for i in {1..5}; do 
    count=5; a=0; 
    printf "\x$(printf %x '65+$a')"; 
    count=count+1; 
done

如果count = 5,我想打印5个变量。即A B C DE。如果count = 2,则打印2个变量A B,等等。

2 个答案:

答案 0 :(得分:1)

这是一个符合您风格的程序,可以满足您的需求:

a=0
for i in {1..5}; do 
    printf "\x$(printf %x $(( 65 + a )) )"; 
    a=$((a+1)); 
done

首先要注意的是,为了在bash中进行数学运算,您需要使用$(())操作。在上面,您可以看到我用$((65 + a))替换了'65 + $ a'。那是要完成数学运算的大新闻。

还有其他一些小问题,但是您受制于$(())东西,因此尚不清楚。顺便说一句,可以从程序中完全删除“ a”变量,只需要像这样使用“ i”变量即可:

for i in {1..5}; do 
    printf "\x$(printf %x $(( 64 + i  )) )"; 
done

由于我们现在从1开始计数,因此我不得不将常数更改为64。

{1..5}表达式对于1 2 3 4 5是一个很好的捷径,但是您将不能在其中放入变量。因此,如果您需要重新添加一个count变量,请考虑使用seq程序,如下所示:

count=$1
for i in $(seq 1 $count); do 
    printf "\x$(printf %x $(( 64 + i  )) )"; 
done

请注意,$()与数学运算符$(())不同。 $()运行一个返回结果的子命令。

答案 1 :(得分:0)

方法1:简单的括号扩展

#!/bin/bash

# generate a lookup table
vars=( - $(echo {A..Z}) )

# use the elements
for i in {1..5}; do
    echo ${vars[$i]}
done
  • {A..Z}生成26个字符串:AB,...,Z
  • 通过vars=( ... )
  • 存储在数组变量中
  • 我们在-前面加上了我们会忽略的
  • 然后我们可以对数组进行基于1的索引
  • 限制为26个变量(或我们选择的任何范围)

方法2:多括号扩展以生成任意长变量

#!/bin/bash

if [[ ! $1 =~ ^[0-9]+$ ]]; then
    echo "Usage: $0 count"
    exit
fi

cmd='{A..Z}'
for (( i=$1; i>26; i=i/26 )); do
    cmd="${A..Z}$cmd"
done
vars=( $(eval echo $cmd) )

for (( i=0; i<$1; i++ )); do
   echo ${vars[$i]}
done
  • i/26进行整数除法(丢弃余数)
  • 我很懒,并且会生成“绰绰有余”的变量,而不是尝试计算“完全足够”的数量
  • {a..b}{a..b}{a..b}成为aaa aab aba abb baa bab bba bbb
  • 使用eval可使括号进行扩展,而无需事先知道需要多少套

示例输出:

$ mkvar.sh 10000 |fmt -64 | tail -5
ORY ORZ OSA OSB OSC OSD OSE OSF OSG OSH OSI OSJ OSK OSL OSM
OSN OSO OSP OSQ OSR OSS OST OSU OSV OSW OSX OSY OSZ OTA OTB
OTC OTD OTE OTF OTG OTH OTI OTJ OTK OTL OTM OTN OTO OTP OTQ
OTR OTS OTT OTU OTV OTW OTX OTY OTZ OUA OUB OUC OUD OUE OUF
OUG OUH OUI OUJ OUK OUL OUM OUN OUO OUP