Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100105
  • 博文数量: 64
  • 博客积分: 3050
  • 博客等级: 中校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-22 18:16
文章分类
文章存档

2010年(56)

2009年(8)

我的朋友

分类:

2009-12-22 21:00:09

都是未记载在笔记本上的东西
 
關於 echo 命令所支援的反斜線控制字符如下表:
        \a:ALERT / BELL (從系統喇叭送出鈴聲)
        \b:BACKSPACE ,也就是向左退格鍵
        \c:取消行末之換行符號
        \E:ESCAPE,跳脫鍵
        \f:FORMFEED,換頁字符
        \n:NEWLINE,換行字符
        \r:RETURN,回車鍵
        \t:TAB,表格跳位鍵
        \v:VERTICAL TAB,垂直表格跳位鍵
        \n:ASCII 八進位編碼(以 x 開首為十六進位)
        \\:反斜線本身
 
例二:

CODE:
$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
a       b       c
d       e       f

與例一的結果一樣,只是使用 ASCII 八進位編碼
 
例三:

CODE:
$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a       b       c
d       e       f

與例二差不多,只是這次換用 ASCII 十六進位編碼。
例四:

CODE:
$ echo -ne "a\tb\tc\nd\te\bf\a"
a       b       c
d       f $

因為 e 字母後面是退格鍵(\b),因此輸出結果就沒有 e 了。
在結束時聽到一聲鈴嚮,那是 \a 的傑作﹗
由於同時使用了 -n 選項,因此 shell prompt 緊接在第二行之後。
若你不用 -n 的話,那你在 \a 後再加個 \c ,也是同樣的效果。
 
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO12.23
除了 IFS 與 CR ,常用的 meta 還有:
= :  設定變量。
$ :  作變量或運算替換(請不要與 shell prompt 搞混了)。
> :重導向 stdout。
< :重導向 stdin。
|:命令管線。
& :重導向 file descriptor ,或將命令置於背境執行。
( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ }:將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。
!:執行 history 列表中的命令
....

 
 
CODE:
        $ A='B
        > C
        > '
        $ echo "$A"
        B
        C

在上例中,由於 被置於 hard quote 當中,因此不再作為 CR 字符來處理。
這裡的 單純只是一個斷行符號(new-line)而已,由於 command line 並沒得到 CR 字符,
因此進入第二個 shell prompt (PS2,以 > 符號表示),command line 並不會結束,
直到第三行,我們輸入的 並不在  hard quote 裡面,因此並沒被關閉,
此時,command line 碰到 CR 字符,於是結束、交給 shell 來處理。
 

CODE:
        $ A="B
        > C
        > "
        $ echo $A
        B C

然而,由於 echo $A 時的變量沒至於 soft quote 中,因此當變量替換完成後並作命令行重組時 會被解釋為 IFS ,而不是解釋為 New Line 字符
"$A" 和 $A 没理解··关于会被解释为IFS,而不是解释为NewLine字符 没理解····
应该是不了解$含义的原因··· 先放一边!!!!???????????????????

您或許發現光是一個 鍵所產生的字符就有可能是如下這些可能:
CR
IFS
NL(New Line)
FF(Form Feed)
NULL
...
至於甚麼時候會解釋為甚麼字符,這個我就沒去深挖了,或是留給讀者諸君自行慢慢摸索了... ^_^

 

區分出 shell meta 與 command meta :这个不懂,Google了一下,还得看awk和sed后再来理解··· 先放一边··回头来学!!!!??????????????????????

(提示:關於 ${name} 事實上還可做到更多的變量處理能力,這些均屬於比較進階的變量處理,
現階段暫時不介紹了,請大家自行參考資料。如 CU 的貼子:

)  这个还没去看~mark
????????????????????????

CODE:
        $ str=                # 設為 null
        $ var=${str=expr}        # 定義 var
        $ echo $var
       
        $ echo $str
       
        $ unset str        # 取消
        $ var=${str=expr}        # 定義 var
        $ echo $var
        expr
        $ echo $str
        expr


聰明的讀者(yes, you!),稍加思考的話,
應該不難發現為何同樣的 var=${str=expr} 在 null 與 unset 之下的不同吧?

##############不了解  var=${str=expr}  #############

郁闷啊,不是{}里面的都是变量名吗~~~还是expr这个值把原来的空值给覆盖了啊??

抓狂啊啊啊~~~~~~~??????????????????????????????????????????

===========================================================================
最後比教一下 ${str=expr} 與 ${str:=expr} :
* 兩者在 not set 與 not null 都一至
* 但當 null 值時,前者會將 $var 與 $str 都設為 null ,但後者則設為 expr
======================================================================待解决
今天看到第六问···明天晚上继续~~~~~回去咯
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO12.24
 
 
任意的script,只要加上'路径名'和'script的名字',前面再加个source,那个script里的命令就能在当前shell进程运行!!这样,写的一个script就可以供其他的script使用了~  呵呵,不晓得这样理解正确不正确
 
================================================
假設我們定義了一個變量為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 .  及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 .  及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 .  及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 .  及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
    # 是去掉左邊(在鑑盤上 # 在 $ 之左邊) 掐头
    % 是去掉右邊(在鑑盤上 % 在 $ 之右邊) 掐尾
    單一符號是最小匹配﹔兩個符號是最大匹配。
      ===================================================
    ${file:0:5}:提取最左邊的 5 個字節:/dir1
    ${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2

    我們也可以對變量值裡的字串作替換:
    ${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
     
     
    利用 ${ } 還可針對不同的變數狀態賦值(沒設定、空值、非空值):
    ${file-my.file.txt} :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
    ${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
    ${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
    ${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
    ${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
    ${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
    ${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
    ${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)
     
    一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.

    還有哦,${#var} 可計算出變量值的長度
    ${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節...

     
    XOR异或 相同得0 不同得1
     
    ??????????????????????????????????????????????????????????????????????
    假如當前的  umask 是 022 ,那麼新建文件的權限即為:

    CODE:
    $ umask 022
    $ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
    644

    ??????????????????????????????????????????

     

    参考这篇文章
     
    常見的用於 (( )) 的測試符號有如下這些:
      <:小於
      >:大於
      <=:小於或等於
      >=:大於或等於
      ==:等於
      !=:不等於
    88888888888888888888888888888888888888888888888888888888888888809.12.24
    开始于第九问
     
    ======================================================
     my.sh script  

     
    CODE:
    #!/bin/bash

    my_fun() {
        echo '$0 inside function is '$0
        echo '$1 inside function is '$1
        echo '$2 inside function is '$2
    }

    echo '$0 outside function is '$0
    echo '$1 outside function is '$1
    echo '$2 outside function is '$2

    my_fun fp1 "fp2 fp3"

    然後在 command line 中跑一下 script 就知道了:

    CODE:
    chmod +x my.sh
    ./my.sh p1 "p2 p3"
    $0 outside function is ./my.sh
    $1 outside function is p1
    $2 outside function is p2 p3
    $0 inside function is ./my.sh
    $1 inside function is fp1
    $2 inside function is fp2 fp3
     
    ====================================看看,时常复习复习,加强印象
     
     
    test 的表示式我們稱為 expression ,其命令格式有兩種:

    CODE:
    test expression
    or:
    [ expression ]

    (請務必注意 [ ] 之間的空白鍵﹗)
     
    bash 的 test 目前支援的測試對像只有種:
    * string:字串,也就是純文字。
    * integer:整數( 0 或正整數,不含負數或小數點)。
    * file:文件。
     


    CODE:
    $ A=123
    $ [ -n "$A" ] && echo "yes! it's ture."
    yes! it's ture.
    $ unset A
    $ [ -n "$A" ] && echo "yes! it's ture."
    $ [ -n "$A" ] || echo "no, it's NOT ture."
    no, it's NOT ture.
     
     

     
    用多個 && 或 || 來組建呢:

    CODE:
    $ A=123
    $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture."
    yes! it's ture.
    $ unset A
    $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture."
    no, it's NOT ture.

    怎樣,從這一刻開始,你是否覺得我們的 shell 是"很聰明"的呢

    ==================================================
    CODE:
    $ ls my.file no.such.file 1>file.both 2>&1

    $ ls my.file no.such.file 2>file.both >&2
     
    看到11问的11.4

     

     

     

    88888888888888888888888888888888888888888888888+09.12.31

    大汗,12问没彻底看懂·······

     

    與 break 相同的是:continue 後面也可指定一個數值 n ,以決定繼續哪一層(從裡向外計算)的循環,
    預設值為 continue 1 ,也就是繼續當前的循環。

     

     

    13问结束了!

    在09年的最后一天

     

     

     

     



     
    阅读(296) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~