userful-shell
- 使用
bc
计算表达式:
#!/bin/bash
var1=10.45var2=43.67var3=33.2var4=71# scacle 表示小数点的位数var5=`bc <<EOFscale=4a1 = $var1 * $var2b1 = $var3 * $var4a1 + b1EOF# 或者使用var5=`echo "scale=4; ($var1 * $var2) + ($var3 * $var4)" | bc``echo The final answer for this mess is $var5
- let 不需要空格隔开表达式的各个字符。而 expr 后面的字符需要空格隔开各个字符。
s=`expr 2 + 3`s=`expr \( 2 + 6 \) \* 3`let s=(2+3)*4let s++
- 读取文件
#!/bin/bash# reading data from a file
count=1cat test | while read linedo echo "Line $count: $line" let count++ # count=$[ $count + 1 ]doneecho "Finished processing the file"
- 获取脚本文件名称
name=`basename $0`echo The command entered is $name
- 获取用户输入
#如果不指定变量,read命令就会把它收到的任何数据都放到特殊环境变量REPLY中read -p "Enter a number:"factorial=1for (( count=1; count<=$REPLY; count++))do factorial=$[ $factorial * $count ]doneecho "The factorial of $REPLY is $factorial"
read
进阶用法
read -s # -s隐藏输入,用于输入"敏感"信息echo hello|read foo # Delimiters given via "-d" are taken as one string echo a==b==c | read -d == -l a b c echo $a # a echo $b # b echo $c # c
read -n 1 line # 仅允许输入一个字符, 输入完毕后立即执行下一命令.
: ${1?"Usage: $0 ARGUMENT"}
: 如果为输入任何参数则退出脚本.basename $PWD
或者${PWD##*/}
: 获取当前基础目录echo $'\n\v'
: 可以用于替代echo -e '\n\v'
.directory=${1-
pwd}
: 如果没有特殊指定, 则使用当前目录.trap "ehco 'program exit...'; exit 2" SIGINT
: 当程序手动终止(按下Ctrl+C
)时触发信号expr $1 + 1 > /dev/null 2>&1
: 判断参数一是否为数字, 使用$?
的值进行判断.