作者 主題: shell 展開 再展開  (閱讀 8666 次)

0 會員 與 1 訪客 正在閱讀本文。

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 621
    • 檢視個人資料
shell 展開 再展開
« 於: 2004-07-28 23:09 »
shell 要執行時,會先對特定的東東作展開的動作

1. wildcard
2. alias
3. metacharacter
4. IF ENDIF CASE ESAC WHILE
5. 重導向符號 | , >>, >, <
6. 變數 $PATH
7. S()
8. shell script,function, built-in command,executable file

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 621
    • 檢視個人資料
wildcard巧思變一變 ^ - ^ ---- [PART I]
« 回覆 #1 於: 2004-07-29 08:31 »
變一:
--------------------------------
$vi move

代碼: [選擇]

for file in $*
do
     mv $file $file.x
done



$ls
ch01 ch02 ch03 move
$move ch??
$ls
ch01.x ch02.x ch03.x move

--------------------------

變二:


代碼: [選擇]

for nn in $*
do
          mv ch$nn sect$nn
done



$ls
ch01 ch02 ch03 move
$move 01 02 03
$ls
sect01 sect02 sect03 move

----------------------------------------------------

變三:

代碼: [選擇]
for variable in `grep -l "alcuin" *`





 :wink: 以上

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17340
    • 檢視個人資料
    • http://www.study-area.org
shell 展開 再展開
« 回覆 #2 於: 2004-07-29 09:48 »
要更好的理解 shell 的多重替換及重組, 最好了解一下 eval 命令.

如:
$ a=b
$ b=c
$ eval var=\$$a #註一
$ echo $var
c

# 註一:
關於 \ (escape) 可參考:
http://bbs.chinaunix.net/forum/viewtopic.php?p=1511745#1511745

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 621
    • 檢視個人資料
alias
« 回覆 #3 於: 2004-08-03 06:56 »
# Remove .o files.
alias clean='find ~ -name \*.o -exec rm {} \;'

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 621
    • 檢視個人資料
metacharacter
« 回覆 #4 於: 2004-08-03 07:22 »
$@ 代表所有引數
$* 代表所有引數
$# 代表引數個數
$? 代表傳回值
$$ Process ID.
$0 Command name. 命令名稱
$n nth argument 第幾個引數 (0<n9).
$xxx 變數xxx的值

${xxx} 也是變數xxx的值,只是這樣定義較明確 (註一)
${xxx=ooo} 也是變數xxx的值

$() 命令的先執行後替換 例: ls -l $(type -path cc)
$(()) 數學的運算 例: $((2537%1000))



引用
小徒註一:

如果在 ${} 裡有 : 的符號,代表在作字串的處理
如果在 ${} 裡有 # 或 % 或 / 的符號,代表在作字串的比對及切割


HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3974
    • 檢視個人資料
shell 展開 再展開
« 回覆 #5 於: 2004-08-08 18:32 »
$@ 跟 $* 有什麼不一樣?? :-)
我做人那麼 nice, 肯定有什麼誤會.....

唐小路

  • 活潑的大學生
  • ***
  • 文章數: 277
    • 檢視個人資料
shell 展開 再展開
« 回覆 #6 於: 2004-08-08 20:51 »
老實說...我是覺得一樣耶
....

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17340
    • 檢視個人資料
    • http://www.study-area.org
shell 展開 再展開
« 回覆 #7 於: 2004-08-08 22:48 »
在沒有 quoting 時, $* 與 $@ 是一樣的.
$@: a b c
$*: a b c

但在 soft quote 中, 卻有差異:
"$@": "a" "b" "c"
"$*": "a b c"

要不然, 寫個 for loop 來看就很清楚了:
代碼: [選擇]
#!/bin/bash
for i in "$@"; do
    echo $i
done
echo ----
for i in "$*"; do
    echo $i
done

然後吃兩三個參數看看?

Anonymous

  • 訪客
shell 展開 再展開
« 回覆 #8 於: 2004-08-08 23:24 »
天外飛來一腳~~

差別在 IFS 喔~~ :-)

HaWay Offline