Bash 编程和使用零散整理(个人所用非系统化笔记,更新时间2011.2.4)

  • ssh localhost 得到一个新的Shell
  • printenv LINUXCBT 打印环境变量、set/env 查看所有环境变量、/etc/skel 下边的变量都是新建用户继承的
  • test是一个命令,用于检测,0为true,1为false (man test查看比较选项)
  • tac是cat的反向
  • touch一个文件,若这个文件存在则不会覆盖,但会更新修改时间。
  • cut命令可以token一行文字
  • ls -A| wc -l 文件个数统计
  • sleep 暂停(秒) usleep(微秒)
  • script 记录shell操作的过程,Ctrl-d结束
  • time 计时所用
  • watch命令是定期循环执行一个命令
  • expr 是测试表达式的
  • info 可以查看一个命令的基本情况说明
    --help 查看基本参数
    man 查看具体参数和说明
  • date +%N 可以用来生成随机数
  • seq可以构造循环
  • read 读入一个变量(可以放在shell脚本中作为input)
  • Ctrl + z 放到后台挂起
    jobs 看后台挂起的作业
    fg 放到前台
  • tr 用于转换字符串、处理字符串 :echo FILEEE1 | tr -s A-Z | tr A-Z a-z
  • basename 从绝对路径中获取文件名或者后缀
  • source 可用作include一个shell脚本(用一个点再加一个空格是不启动子shell直接在当前shell环境下执行)
  • mkdir test{1,2,3}(5,6}
  • $? 返回上次命令是否正确执行,若有则返回0,若无该命令则返回127,返回2为bad argument,权限问题返回126,用户中断返回130
  • ls -l && pwd 只有前一个正确执行了后一个才会执行。可以理解为C语言中的&&符,相反||则是前一个失败了才会执行后一个,这其实就可以构成了一个if语句。在shell脚本中经常这样简写。
    要是一个变量里面带有格式化的符号,可以用echo "$var" 保留格式
  • 命令替换除了使用反引号外还可以这样:etcdir1=$(ls -l /etc)
  • 输入重定向:filelist=`< list.txt`
  • 引号:在bash中有两种引号,一种是强引号,保留所有字面上的字(单引号),一种是弱引号(双引号),替换命令、变量,保留格式,当然默认是不保留格式,替换命令、变量。
  • 表示空格:mkdir test\ a\ directory
  • mail可以让你发本地邮件或者是外埠邮件
  • 定义function可以不加这个关键词function
    循环中的变量递增:let "COUNT += 1";
  • 条件的表达:
    test $NUM -lt $MAX 等效于[ $NUM -lt $MAX ]
  • 变量做计算时使用:let arg [arg ...]
  • 不想保存也不想显示的东西重定向到/dev/null
  • 字符串比较: [ "Script" = "Script" ](大小写敏感)
  • 检查某个服务是不是有:
    netstat -ant |grep 80 >/dev/null 此时$?代表了这个命令是否运行正确,或者说这个服务是否启动 echo $?查看即可
  • case语句的default语法为 *)
  • shell脚本需要变量时,变量个数不对exit返回165。
  • Shell脚本写个简单的交互菜单:

#!/bin/bash

echo "This script can make any of the files in this directory private."
echo "Enter the number of the file you want to protect:"

PS3="Your choice: "
QUIT="QUIT THIS PROGRAM - I feel safe now."
touch "$QUIT"

select FILENAME in *;
do
case $FILENAME in
"$QUIT")
echo "Exiting."
break
;;
*)
echo "You picked $FILENAME ($REPLY)"
chmod go-rwx "$FILENAME"
;;
esac
done
rm -f "$QUIT"

  • Linux的Log系统产生的Log文件,若是没有后缀则表示是当前的Log
  • 变量赋值:

    变量赋值方式

    str没有赋值

    str为空字符串

    str为非空字符串

    备注

    var=${str-expr} var=expr var=$str var进行设置
    var=${str+expr} var=$str var=expr var进行设置,varstr要不都取值,要不都不取值。虽然取值不同
    var=${str=expr} str=expr
    var=expr
    str不变
    var=$str
    varstr进行设置,

    varstr保持一致

    var=${str?expr} expr输出至stderr var=str var进行设置
    var=${str:-expr} var=expr var=$str
    var=${str:+expr} var= var=expr
    var=${str:=expr} str=expr
    var=expr
    str不变
    var=$str
    var=${str:?expr} expr输出至stderr

  • 变量运算:在BashShell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术运算,需要使用let命令,语法为: letexpr
    expr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若radio>;10,那么数字字符可从0-9和A-Z.
    当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.使用let时还需要注意的时,对于letx+y这样的式子,shell虽然计算了x+y的值但却将结果丢弃,若不想这样,可以使用letsum=x+y将x+y的结果保存在变量sum中另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术表达式的引用,如果想返回表达式的值,则需用$(())的格式.
  • 要希望程序在后台运行又不输出任何信息到屏幕上刻意将错误重定向到标准输出,然后再重定向到 /dev/null,例如:# ls >/dev/null 2>&1
  • 可以利用sleep来进行临时闹钟设置:sleep 8h && vlc music.mp3
  • shell脚本报错:"[: =: unary operator expected" :在匹配字符串相等时常出现,多加一层[]就可以了:if [[ $STATUS = "OK" ]]; then echo "OK"fi
  • var=${parameter:-defaultValue} 一个变量parameter若是没有设置就是用默认值defaultvalue。另外一种方式是
    var=${parameter:-=defaultValue},但是这种方式不支持shell脚本传入的参数。
  • _domain="${1:?Usage: mknginxconf domainName}" 这说明要是没有传入参数则该shell脚本将停止并且打印这条信息。
  • ${#var} 是这个变量的长度。
  • 去掉该变量前边的一些字符:比如var=test123,则echo ${var#test}输出的就是123。这行的意思是说var去掉从左到右第一个test,若想从右到左,删除某字符char前的所有字符(包含char),则使用##*char。例如,_self="${0##*/}"就得到了basename一样的效果——该shell的名字。${var%pattern}则是从右往左去除某个字符。
  • 查找和替代:${varName/Pattern/Replacement} 这是替代单个的,若想替代全部则使用${varName//Pattern/Replacement},例如:y=/etc/resolv.conf cp "${y}" "${y/.conf/.conf.bak}"

${parameter:-defaultValue} Get default shell variables value
${parameter:=defaultValue} Set default shell variables value
${parameter:?"Error Message"} Display an error message if parameter is not set
${#var} Find the length of the string
${var%pattern} Remove from shortest rear (end) pattern
${var%%pattern} Remove from longest rear (end) pattern
${var:num1:num2} Substring
${var#pattern} Remove from shortest front pattern
${var##pattern} Remove from longest front pattern
${var/pattern/string} Find and replace (only replace first occurrence)
${var//pattern/string} Find and replace all occurrences

你可能感兴趣的:(编程,linux,ssh,脚本,bash)