Advanced Bash-Shell Guide(Version 10) 学习笔记一

我喜欢的一句话
the only way to really learn scripting is to write scripts
学习脚本的唯一方法就是写脚本

更好的命令行参数检测
    E_WRONGARGS=85 # Non-numerical argument (bad argument format).
    41 #
    42 # case "$1" in
    43 # "" ) lines=50;;
    44 # *[!0-9]*) echo "Usage: `basename $0` lines-to-cleanup";  
    参数中间没有数字,无效参数
    45 # exit $E_WRONGARGS;;
    46 # * ) lines=$1;;
    47 # esac

更有效的目录检测
    3 # cd /var/log || {
    64 # echo "Cannot change to necessary directory." >&2
    65 # exit $E_XCD;
    66 # }

#!/bin/sh invokes the default shell interpreter, which
    defaults to /bin/bash on a Linux machine.
    #!/bin/bash 叫做sha-bang  magic number

测试调用的参数数量是否正确
    1 E_WRONG_ARGS=85
    2 script_parameters="-a -h -m -z"
    3 # -a = all, -h = help, etc.
    4
    5 if [ $# -ne $Number_of_expected_args ]
    6 then
    7 echo "Usage: `basename $0` $script_parameters"
    8 # `basename $0` is the script‘s filename.
    9 exit $E_WRONG_ARGS
    10 fi

调用脚本
    bash scriptname

chmod 555 scriptname (gives everyone read/execute permission) [9]
    or
    chmod +rx scriptname (gives everyone read/execute permission)
    chmod u+rx scriptname (gives only the script owner read/execute permission)

./scriptname

1 #!/bin/rm
    2 # Self-deleting script.
    echo "This line will never print (betcha!)."
    这是一个自杀的脚本
    # Nothing much seems to happen when you run this...
    except that the file disappears.

将文档改成#!/bin/more 并且添加可执行权限
结果就是自列表文档 类似cat XX | more

特殊字符
# 注释 ,行开头#注释,不被执行,取消语法检测
    在引号和逃逸符里面不是注释
        
    6 echo ${PATH#*:} # Parameter substitution, not a comment.
    7 echo $(( 2#101011 )) # Base conversion, not a comment.

; 命令分隔符
    1 echo hello; echo there
;;     case选项分隔符
    1 case "$variable" in
    2 abc) echo "\$variable = abc" ;;

. 相当于source 刷新配置文件,重新加载

作为文件名称的一部分,隐藏文件
    
   相当于当前目录,..相当于上级目录

在正则表达式中匹配单个字符

"    部分引用或弱引用,抑制大部分的特殊字符
‘    强引用,抑制所有的特殊字符
,    链接一串算数操作,只返回最后的结果
    1 let "t2 = ((a = 9, 15 / 3))"
    2 # Set "a = 9" and "t2 = 15 / 3"

链接字符串
    1 for file in /{,usr/}bin/*calc
    2 # ^ Find all executable files ending in "calc"
    3 #+ in /bin and /usr/bin directories.

\    逃逸字符,表达字符字面值的意思
/     文件路径分隔符
`    输出命令结果给变量
:    不做任何事,占位符
    :>将文件长度改为0,并且不改变权限,不在则创建
    : > data.xxx # File "data.xxx" now empty.
    Same effect as cat /dev/null >data.xxx
    也可作为域分隔符 在/etcpasswd中
    
! 转换退出状态或者测试的感觉
    change the sense of equal ( = ) to not-equal ( != )
    也可调用命令历史

*    通配
    在正则中匹配0个或多个字符
    在算数中 单个表示乘号 两个表示阶乘

?    在双括号中,?作为三元操作符
    (( var0 = var1<98?9:21 ))
    在通配和正则中代表单个字符

$    变量
    跟变量名表示变量的值
    在正则中表示一行的结尾
[email protected]    $*  位置参数
$?    退出状态的变量
$$ 表示当前脚本的进程ID
()    命令组,括号中的命令是子shell,对外面不可见
    数组初始化
        1 Array=(element1 element2 element3)
{}    命令扩展
    8 cp file22.{txt,backup}
    9 # Copies "file22.txt" to "file22.backup"
    ----
    echo {file1,file2}\ :{\ A," B",‘ C‘}
    file1 : A file1 : B file1 : C file2 : A file2 : B
    file2 : C
    ----
    echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z
    ----
    8 base64_charset=( {A..Z} {a..z} {0..9} + / = )
    9 # Initializing an array, using extended brace expansion.
    表示代码块
    对脚本其他地方可见,非子shell
    1 a=123
    2 { a=321; }
    3 echo "a = $a" # a = 321 (value inside code block)
    也可作为占位符
    ls . | xargs -i -t cp ./{} $1
    
[]    表示测试
    数组元素
        1 Array[1]=slot_1
        2 echo ${Array[1]}
    表示字符范围    
$(())    整数表达式
    1 a=3
    2 b=7
    3
    4 echo $(($a+$b)) # 10
> &> >& >> < <>      重定向操作符
    < > 作为ASCII码比较
\<,\>    单词锚定
|     管道
    Passes the output (stdout) of a previous command to the input (stdin) of the next one
    管道作为子shell运行,因此不能修改父shell的变量
>|     强制重定向
||    逻辑或
&    后台运行job
&&    逻辑与
^    行头部匹配
    
    备份当前目录最近24小时内修改的文件
    1 #!/bin/bash
    2
    3 # Backs up all files in current directory modified within last 24 hours
    4 #+ in a "tarball" (tarred and gzipped file).
    5
    6 BACKUPFILE=backup-$(date +%m-%d-%Y)
    7 # Embeds date in backup filename.
    8 # Thanks, Joshua Tschida, for the idea.
    9 archive=${1:-$BACKUPFILE}
    10 # If no backup-archive filename specified on command-line,
    11 #+ it will default to "backup-MM-DD-YYYY.tar.gz."
    12
    13 tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
    14 gzip $archive.tar
    15 echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
    16
    17
    18 # Stephane Chazelas points out that the above code will fail
    19 #+ if there are too many files found
    20 #+ or if any filenames contain blank characters.
    21
    22 # He suggests the following alternatives:
    23 # -------------------------------------------------------------------
    24 # find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"
    25 # using the GNU version of "find".
    26
    27
    28 # find . -mtime -1 -type f -exec tar rvf "$archive.tar" ‘{}‘ \;
    29 # portable to other UNIX flavors, but much slower.
    30 # -------------------------------------------------------------------
    31
    32
    33 exit 0

时间: 2024-10-08 17:02:59

Advanced Bash-Shell Guide(Version 10) 学习笔记一的相关文章

Advanced Bash-Shell Guide(Version 10) 学习笔记二

变量替换$variable 是 ${variable}的简写    39 hello="A B C D"    40 echo $hello # A B C D    41 echo "$hello" # A B C D    引号保留变量里面的空白        1 echo "$uninitialized" # (blank line)    2 let "uninitialized += 5" # Add 5 to it

Advanced Bash-Shell Guide(Version 10) 学习笔记三

书上的脚本比较多 记录比较有用的脚本 更好的方式检查命令行参数是否为数字 40 # E_WRONGARGS=85 # Non-numerical argument (bad argument format). 41 # 42 # case "$1" in 43 # "" ) lines=50;; 44 # *[!0-9]*) echo "Usage: `basename $0` lines-to-cleanup"; 45 # exit $E_WR

shell编程教程or学习笔记

----------------------------------------------------hello world------------------------------------------- linux 创建如下文件 vim hello #! /bin/bash   //告诉Shell 使用哪个Shell 程序 #Display  a line    //#表示注释 //空白行用来区分不同更功能 没有实际意义 name="[email protected]" ec

&lt;&lt;linux命令行与shell脚本编程大全&gt;&gt;学习笔记(1)

一章初识linux shell 一.什么是linux 1.linux系统可大致划分为四部分: l Linux内核 l GNU工具组件 l 图形化桌面环境 l 应用软件 在linux系统里,这四部分中的每一部分都扮演着一个特别的角色,但如果将他们分开,每一部分都没太大的作用. 1)探究linux内核 Linux系统的核心是内核,内核控制着计算机系统上的所有硬件和软件,必要时分配硬件,有时需要执行软件. 内核基本负责以下四项主要功能: l 系统内存管理 l 软件程序管理 l 硬件设备管理 l 文件系

九十分钟极速入门Linux——Linux Guide for Developments 学习笔记

系统信息:CentOS 64位. 一张图了解命令提示符和命令行 一些实用小命令 mkdir(make directory,创建目录).ls(list,列出当前目录下的内容).rm(remove,删除文件,如果删除目录,需要加参数-r,表示递归-recursive删除).man(manual,手册,后面跟命令打开该命令的使用手册,进入后键入/- 参数:查找参数如何使用,n查找下一处,q退出用户手册).ctrl+l(清屏).pwd(print working dir,显示工作路径).ctrl+a:到

SHELL脚本攻略(学习笔记)--1.6 数学运算和bc命令

本文目录: 1.6.1 基本整数运算 1.6.2 bc命令高级算术运算 使用let.$(())或$[]进行基本的整数运算,使用bc进行高级的运算,包括小数运算.其中expr命令也能进行整数运算,还能判断参数是否为整数,具体用法见expr命令全解. 1.6.1 基本整数运算 [[email protected] tmp]# str=10 [[email protected] tmp]# let str=str+6 # 等价于let str+=6 [[email protected] tmp]# l

Direct3D 10学习笔记(一)——初始化

本篇将简单整理Direct3D 10的初始化,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电子书<DirectX 10 3D游戏编程入门>). Direct3D 10的初始化可分为以下几个步骤: 1.填充一个DXGI_SWAP_CHAIN_DESC结构体,用于描述了所要创建的交换链特性. 2.使用D3D10CreateDeviceAndSwapChain函数创建ID3D10Device设

Direct3D 10学习笔记(二)——计时器

本篇将简单整理Direct3D 10的计时器实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电子书<DirectX 10 3D游戏编程入门>). 1.高精度性能计数器 Direct3D10使用高精度性能计数器(精度达微秒级)实现精确时间测量,为了调用下面介绍的两个Win32计数器API,需要添加包含语句“#include <windows.h>” 1 BOOL QueryP

SHELL脚本攻略(学习笔记)--1.7 expr命令全解

expr命令可以实现数值运算.数值或字符串比较.字符串匹配.字符串提取.字符串长度计算等功能.它还具有几个特殊功能,判断变量或参数是否为整数.是否为空.是否为0等. 先看expr命令的info文档info coreutils 'expr invocation'的翻译. 16.4.1 字符串表达式 ------------------------- 'expr'支持模式匹配和字符串操作.字符串表达式的优先级高于数值表达式和 逻辑关系表达式. 'STRING : REGEX' 执行模式匹配.两端参数