Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61428
  • 博文数量: 20
  • 博客积分: 1031
  • 博客等级: 少尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-11 14:22
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(4)

2009年(14)

我的朋友

分类:

2011-05-11 15:26:51

记录shell 编程的点点滴滴 ^_^


2011.5.6 ______________________________________________________________



Linux SHELL if 命令参数说明

–b 当file存在并且是块文件时返回真
-c 当file存在并且是字符文件时返回真
-d 当pathname存在并且是一个目录时返回真
-e 当pathname指定的文件或目录存在时返回真
-f 当file存在并且是正规文件时返回真
-g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
-h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
-k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
-p 当file存在并且是命令管道时返回为真
-r 当由pathname指定的文件或目录存在并且可读时返回为真
-s 当file存在文件大小大于0时返回真
-u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
-w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
-o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。

UNIX Shell 里面比较字符写法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串






2011.5.11 ______________________________________________________________

shell注释多行的方法,在网上找到一个文章,介绍得比较全:


自己试过,可以这样做:
: << NOTE
注释的正文第1行
...
注释的正文第n行
NOTE

其实是利用“NOTE” 作为注释的开头和结尾标志,  而 : 就是什么都不作的意思;





多行注释 + 两个if叠加 + 函数 的用法,见下例:
echo
make
makeresult=$?
echo
tar cjf liblog4c.tbz2 liblog4c.so*
tarresult=$?
echo
usleep 500000

: << NOTE
1、多行注释 Yeah!
2、ftppp函数体定义 Yeah!
3、注意EOF必须放在行首,且不能有空格!
NOTE
ftppp ()
{
    ftp -v -n 193.168.1.110 <     user default pax123
    put liblog4c.tbz2 /usr1/lib/liblog4c.tgz
    bye
EOF
}

: << NOTE
1、这里又是多行注释 Yeah!
2、注意下面的一段中用到了ftppp这个函数,函数体在上面定义了 Yeah!
3、不能把then用在if 这一行后面;
4、: 就是什么也不作(do nothing),即空命令。
NOTE
if [ $makeresult -eq 0 ]
then
    if [ $tarresult -eq 0 ]
    then
        ftppp
    else
        echo tar error!
    fi
else
    echo make error!
fi





还有几个地方要表的:
1、
这里说到了怎么 加入 与、或、非的测试命令,就像在C语言中那样:
表 31.3. 带与、或、非的测试命令
[ ! EXPR ]           !表示逻辑反
[ EXPR1 -a EXPR2 ]   -a表示逻辑与
[ EXPR1 -o EXPR2 ]   -o表示逻辑或


2、

从这里知道 : 就是什么都不作的意思,也是知道 怎么样多行注释 的地方。





2011.5.31 ______________________________________________________________


1、
* 双引號內的特殊字元如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』則『echo $var』可得『lang is en_US』

* 单引號內的特殊字元則僅為一般字元(純文字),如下所示:
『var='lang is $LANG'』則『echo $var』可得『lang is $LANG』

2、
在一串指令中,還需要藉由其他的指令提供的資訊,可以使用反單引號『`指令`』或 『$(指令)』。
注意:那個 ` 是鍵盤上方的數字鍵 1 左邊那個按鍵,而不是單引號!

例如想要取得核心版本的設定:
『version=·uname -r·』再『echo $version』可得『2.6.18-128.el5』
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

题外话:
nnd,chinaunix 的这编辑器也太神奇了,那个按键竟然成了一个小芝麻点,只有一个像素!!!

3、
若該變數為擴增變數內容時,則可用 "$變數名稱" 或 ${變數} 累加內容,如下所示:
『PATH="$PATH":/home/bin』
『PATH=${PATH}:/home/bin』   这里注意:是大括号{},不是小括号()

4、
取消變數的方法為使用 unset:
『unset 變數名稱』

例如取消 myname 的設定:
『unset myname』





2011.7.7 ______________________________________________________________

从一个pdf 里摘录了下面这几个正则表达式的基本元字符,记录下来,以作备忘 ^_^

正则表达式 基本元字符

^  只匹配行首

$  只匹配行尾

*  一个单字符后紧跟*,匹配0个或多个此单字符

.  匹配任意单字符

[] 匹配 [] 内字符。可以是一个单字符,也可以是字符序列。可以使用 - 表示 [] 内字符序列范围,如用 [1-5] 代替 [12345]

\  用来屏蔽一个元字符的特殊含义。因为有时在 shell中一些元字符有特殊含义。\可以使其失去应有意义


举个例子:
拷贝程序到虚拟机的linux 的时候,经常会带进去很多行首空格、行尾空格,可以用简单的方式除掉它们:

对行首空格,可以在vi 的命令状态下用这个命令:
0,$s/^ //

对行尾空格,可以在vi 的命令状态下用这个命令:
0,$s/ $//


在 shell 编程中,一段好的脚本与完美的脚本间的差别之一,就是要熟知正则表达式并学会使用它们。...





2011.7.21 ______________________________________________________________


~/.bash_logout

 這個檔案則記錄了『當我登出 bash 後,系統再幫我做完什麼動作後才離開』的意思。...。 不過,你也可以將一些備份或者是其他你認為重要的工作寫在這個檔案中 (例如清空暫存檔), 那麼當你離開 Linux 的時候,就可以解決一些煩人的事情囉!

__________________________________

在鸟哥的上面那个链接里看到了 ~/.bash_profile 有这么一段:

if [ -f ~/.bashrc ]; then <==底下這三行在判斷並讀取 ~/.bashrc
. ~/.bashrc
fi


查了一下 “.” 在这里是什么含义,竟然发现这个“.” 就是source 的意思... 意外 ^_^

这个命令可以拿来装B用 ^_^^_^^_^

如下:
[...@localhost ...]$ man .
...
. filename [arguments]
source filename [arguments]
  Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.

__________________________________

还是在鸟哥的果园里摘果子,在同一棵树(上面那个链接),摘到下面这个果子,大家尝尝看 ^_^

bash 的進站與歡迎訊息: /etc/issue, /etc/motd

蝦密! bash 也有進站畫面與歡迎訊息喔?真假?真的啊! 還記得在終端機介面 (tty1 ~ tty6) 登入的時候,會有幾行提示的字串嗎?那就是進站畫面啊! 那個字串寫在哪裡啊?呵呵!在 /etc/issue 裡面啊!先來看看:
[root@www ~]# cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m

...,你可以 man issue 配合 man mingetty 得到底下的結果:issue 內的各代碼意義
\d 本地端時間的日期;
\l 顯示第幾個終端機介面;
\m 顯示硬體的等級 (i386/i486/i586/i686...);
\n 顯示主機的網路名稱;
\o 顯示 domain name;
\r 作業系統的版本 (相當於 uname -r)
\t 顯示本地端時間的時間;
\s 作業系統的名稱;
\v 作業系統的版本。

你要注意的是,除了 /etc/issue 之外還有個 /etc/issue.net 呢!...當我們使用 telnet 連接到主機時,主機的登入畫面就會顯示 /etc/issue.net 而不是 /etc/issue 呢!

至於如果您想要讓使用者登入後取得一些訊息,例如您想要讓大家都知道的訊息, 那麼可以將訊息加入 /etc/motd 裡面去!例如:當登入後,告訴登入者, 系統將會在某個固定時間進行維護工作,可以這樣做:[root@www ~]# vi /etc/motd
Hello everyone,
Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^

那麼當你的使用者(包括所有的一般帳號與 root)登入主機後,就會顯示這樣的訊息出來:
Last login: Thu Feb 5 22:35:47 2009 from 127.0.0.1
Hello everyone,
Our server will be maintained at 2009/02/28 0:00 ~ 24:00.
Please don't login server at that time. ^_^

__________________________________

还是在鸟哥的果园里摘果子,在同一棵树(上面那个链接),又摘到几个小果子 ^_^

組合按鍵    執行結果
Ctrl + C   終止目前的命令
Ctrl + D   輸入結束 (EOF),例如郵件結束的時候;
Ctrl + M   就是 Enter 啦!
Ctrl + S   暫停螢幕的輸出
Ctrl + Q   恢復螢幕的輸出
Ctrl + U   在提示字元下,將整列命令刪除
Ctrl + Z   『暫停』目前的命令


底下我們列出一些常用的萬用字元喔:
符號     意義
*       代表『 0 個到無窮多個』任意字元
?       代表『一定有一個』任意字元
[ ]     同樣代表『一定有一個在括號內』的字元(非任意字元)。例如 [abcd] 代表『一定有一個字元, 可能是 a, b, c, d 這四個任何一個』
[ - ]   若有減號在中括號內時,代表『在編碼順序內的所有字元』。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的!
[^ ]    若中括號內的第一個字元為指數符號 (^) ,那表示『反向選擇』,例如 [^abc] 代表 一定有一個字元,只要是非 a, b, c 的其他字元就接受的意思。


除了萬用字元之外,bash 環境中的特殊符號有哪些呢?底下我們先彙整一下:
符號 內容
#   註解符號:這個最常被使用在 script 當中,視為說明!在後的資料均不執行
\   跳脫符號:將『特殊字元或萬用字元』還原成一般字元
|   管線 (pipe):分隔兩個管線命令的界定(後兩節介紹);
;   連續指令下達分隔符號:連續性命令的界定 (注意!與管線命令並不相同)
~   使用者的家目錄
$   取用變數前置字元:亦即是變數之前需要加的變數取代值
&   工作控制 (job control):將指令變成背景下工作
!   邏輯運算意義上的『非』 not 的意思!
/   目錄符號:路徑分隔的符號
>, >> 資料流重導向:輸出導向,分別是『取代』與『累加』
<, << 資料流重導向:輸入導向 (這兩個留待下節介紹)
' ' 單引號,不具有變數置換的功能
" " 具有變數置換的功能!
` ` 兩個『 ` 』中間為可以先執行的指令,亦可使用 $( )
( ) 在中間為子 shell 的起始與結束
{ } 在中間為命令區塊的組合!

阅读(585) | 评论(0) | 转发(0) |
0

上一篇:抄来的代码

下一篇:linux + c

给主人留下些什么吧!~~