ref: https://cmdchallenge.com/#/hello_world
今天分享的是一個有趣的 Command Line Interface(CLI) 挑戰,該挑戰主要是基於 Linux bash 的環境有一系列的指令挑戰
挑戰內容基本上都不會太困難,一開始都是非常基礎的 Linux 指令操作,後面會需要使用 grep, sed, awk, find 等不同指令的組合來完成任務。
大部分的題目都會基於一些情境,譬如想要針對 httpd server 底下的 log 進行過濾,計算符合某些內容的行數等等
每道題目除了自行挑戰外也可以看一下別人的解決方案,不過解決方案中有一些是作弊的內容,譬如直接針對題目用 echo 輸出之類的,就滿搞笑的。
我認為這類型的挑戰有兩個值得去玩看看的理由
1. 測試自已是否能夠解決每一個問題,順便看一下自己的解決方式跟別人的比起來如何,有時候會有一些意想不到的指令與用法可以讓整個寫法更為簡潔
2. 如果有面試需求的時候,可以考慮從這邊找一些相關題目,看看面試者對於 shell script 的熟悉度,同時互相討論每個解法的好壞處。
歡迎愛寫 shell script 的人都寫一遍看看
bash 用法 在 [小抄] Docker 基本命令| 想不起來而已 的推薦與評價
如果啟動時沒有下/bin/bash,就要用exec 去建立bash 的實例。 ... 第1 種用法:是推薦的用法,其設定的命令將作為容器啟動時的預設執行命令。 第2 種用法:param 將 ... ... <看更多>
bash 用法 在 [心得] bash 的eval 用法- 看板Linux - 批踢踢實業坊 的推薦與評價
bash 雖然沒有複雜的資料結構,但都可以透過 eval 來實現。
覺得這東西蠻好玩得,可以寫出一些有趣的 function 。
首先基本款。
但如果變數內容是命令,倒可以真接執行。
所以我一開始才誤會 eval 成 **執行** 變數內容的意思……
cmd="echo $QUERY_STRING"
$cmd
## 這樣會 echo 出 QUERY_STRING 的內容。
QUREY_STRING="a=b c=d"
$QUERY_STRING
## 這樣不行… …
eval $QUERY_STRING
## 這樣可以!
eval 的 *正式* 用法:
for i in `seq $#`
do
eval echo \$$i
done
## 列出所有參數
eval echo \$$#
## 列出最後一個參數
複雜的情況:
因為 eval 時會把雙引號中的變數展開,且拿掉雙引號。
雙引號內的單引號會被看成普通字元,
而真得執行時才會看到單引號和引號內已被展開的變數。
雙引號中也會執行命令代換。
for file in *
do
eval "'$file'"="'`cat $file`'"
done
特殊的用法:
用來處理重導向需要的符號。
output=" >'$PWD/log' "
eval ps aux $output
用在轉義字符:
我一直很好奇 bash 的 $'' 可以作什麼;
後來才想到可以用 eval 來讓 bash *翻譯* 內部的變數。
esc_str='\u0042\u0043'
eval echo "\$'$esc_str'"
命令代換中也可以接收 pipe ,我還蠻意外的。
echo %42%43%44 |
eval echo "\$'`sed -e s/%/\\x/g`'"
什麼鬼,這辦得到嗎?
我開始覺得單雙引號不夠用了;或者要多幾層 eval 。
regex='s/%/\\x/g'
echo %42%43%44 |
eval echo "\$'$(sed -e $regex)'"
eval eval echo "\"\\$'\$(sed -e '$regex')'\""
eval echo "\$'$(sed -e 's/%/\\x/g')'"
echo $'sed_output'
--
因為她不知道,唯一值得她流淚的人,絕不會讓她流淚。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.1.136
※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1463542266.A.CE1.html
※ 編輯: Gold740716 (140.116.1.136), 05/18/2016 11:33:23
... <看更多>