===== Shell (Command Line Interpreter) ===== * https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 * Reference : http://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#Special-Parameters * http://www.blaess.fr/christophe/memo_programmation_shell.html * https://github.com/lmorg/murex# JsoN ==== KSH ==== * korn : http://www.last.fm/user/nmental/journal/2007/09/30/a52jn_linux_humor_ed._2_%28korn_meets_korn%29 ==== GNU TOOLS ==== ==== variables ==== args : "$@" From shell : a=SHELL ; b=$(eval "echo \${${a}}" ); echo $b /bin/bash Same with makefiles : a=SHELL ; b=$$(eval "echo \$${$${a}}" ); echo $$b But it will fail if using gmake env a=CURDIR ; b=$$(eval "echo \$${$${a}}" ); echo $$b export ${USER}_KEY=${EMAIL} t=${USER}_KEY VAL=$(eval echo \${t} ) echo $VAL ps $( /dev/null 2>&1 && echo "$p.$i" ; done for () : for (( i=0; $i <= 999 ; i++ )) ; do echo $i ; done while : ( will eat one line each line) cat $F | while l=`line` ; do echo -E "$l" >> $F.tmp ; t=`line` ; done ; mv $F $F.orig ; mv $F.tmp $F case : case "$m" in jan | Jan) m=01; ;; UntiL : until ping -w 1 -c 1 "$server" &>/dev/null ;do sleep 1 n=$(( n+1 )) [ $n -eq 30 ] && break done #! /bin/bash FILE=$1 # read $FILE using the file descriptors exec 3<&0 exec 0<$FILE while read line do # use $line variable to process line echo $line done exec 0<&3 * https://www.vidarholen.net/contents/blog/?p=1035 ==== eval ==== list='PWD USER' for key in ${list} ; do value=$(eval echo \$${key}) echo "${key}=${value}" done ===== Line ===== ls | awk '{ system ($0 ) }' ls | while L=`line`; do echo $L; read t ; exit; done; # will not work Line per line : use IFS=$'\n' * http://www.osxfaq.com/tips/unix-tricks/week98/thursday.ws prefix="date" ; IFS=$'\n' ; while [ 1 ] ; do date ; sleep 1 ; done | while read line ; do p="$(date +%Y%m%d%H%M%S)" && echo "$p: $prefix: $line" ; done 20131210122521: date: Tue Dec 10 12:25:21 CET 2013 20131210122522: date: Tue Dec 10 12:25:22 CET 2013 ===== Pipe ===== ls /dontexist ; echo $? # = 2 ls /dontexist | tee log ; echo $? # = 0 ls /dontexist | tee log ; echo $PIPESTATUS # = 2 For Plain Sh or BusyBox Workaound for '/bin/sh' or busybox status=0 eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null` echo "# status=${status}" Trace : busybox sh ~/bin/test.sh + status=0 + ls /dontexists + tee /dev/null ls: /dontexists: No such file or directory + echo status=1 + eval status=1 + status=1 + echo # status=1 # status=1 * https://superuser.com/questions/704460/how-do-you-use-pipestatus-tee-and-bin-sh-together/925140#925140 * https://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html# BuffeR AwK @TaG: PipE ===== Multitask ===== #{ test_() { while [ 1 ] do echo "$*=$$" sleep 1 done } main_() { test_ 1 & test_ 2 } $* #} /tmp/t.sh main_ ===== Text manipulation ===== recurvive grep : find ~/bin/ -type f -exec grep -Hn rzr {} \; search & replace : sed -e "s/rzr/RzR/g" < filein.txt >| fileout.txt sed -e "s/rzr/RzR/g" -i fileinout.txt pipes and `` : #! /bin/sh #file://~/bin/killall.sh kill -9 `ps aux | grep $* | cut -b0-10` killall.sh gdb variables on sh bash VARNAME=value echo ${VARNAME} export VARNAME # variables on csh tcsh set VARNAME value echo $VARNAME setenv VARNAME value [[regex]] on Variables : echo ${EMAIL} # root@localhost echo ${EMAIL/@/(a)} # root(a)localhost === Variables=== $ echo $RM $ echo ${RM:=rm} rm $ echo $RM rm $ RM=delete.sh $ echo ${RM:=rm} delete.sh $ echo $RM delete.sh ==== stdout ==== printf "%c\n" $'\x31' # 1 decimal=49 eval printf \"%c\\n\" \$\'\\x$(printf "%02x" $decimal )\' # 1 eval printf \"%c\\n\" \$\'\\x$(echo "obase=16;$decimal" | bc)\' # 1 tar cf - $(find . -iname "*.h") | tar xvf - -C ${DESTDIR}/include ==== SED / [[AWK]] ==== find . -name "*,*" -type d -exec basename {} \; | awk '{ printf "mv " $1 " " ; sub (/_/,"-") ; print $1 }' echo "9.999" | awk '{ printf "%.3f \n", $1 / 3 }' remove each file cat TODO | awk '{ system(" echo " "rm -v \\\"" $1 "\\\" " ) }' * http://stackoverflow.com/questions/1429556/shell-bash-command-to-get-nth-line-of-stdout head -50 | tail -1 = sed '50q;d' @more: AwK SeD [[sh]] ==== USEFULL BLACK MAGIC COMMANDS ==== Will rename [[C]] to [[C++]] files name conventions # ls *.c | xargs -n 1 --replace echo "mv {} {}pp" mv mainc.c mainc.cpp for i in *.ent; do mv $i ${i/ent/gml} ; done rename 's/\.ent$/.gml/' * man mmv grep -v "^$" # remove empty lines prints executables : find . -perm +100 -type f -exec file {} \; | grep "ELF 32-bit LSB" | cut -d':' -f 1 Copy all nodes : s=/mnt/sdb6/ d=/mnt/sdb2/ cd "$s" && time tar cf - . | { cd "$d" && tar xfv - ; } cat files.txt | awk '{ print "tar cvf - " $0 " | tar xvf - -C /tmp "}' > /tmp/movefiles.sh ==== COOL OPTIONS ==== ifconfig | grep -A1 "^eth" # eth0 Link encap:Ethernet HWaddr b8:70:??:??:??:?? UP BROADCAST MULTICAST MTU:1500 Metric:1 ==== SCRIPT SHELL ==== A script shell is a simple series of shell commands : see : # cat file.sh #! /bin/sh echo "I am a script shell" date # sh ./file.sh I am a script shell 32 Dec 2000 search / replace with sed in multiple files : for fl in *.*; do mv $fl $fl.orig sed 's/FINDSTRING/REPLACESTRING/g' $fl.orig > "$fl" #rm -f $fl.orig done sed -i 's/gif/png/g' *.wrl How to substract : 09 - 1 to return 08 totem mms://vipmms.canalplus.fr/canalplus/zapping_`expr $(date +%y%m%d) - 1`_a.wmv ==== PER HOST ENV ==== cat ../chhome/env-chhome.sh #===/bin/sh=== # echo "+ file://~/env-chhome.sh" t=${HOME}/etc/home/$HOSTNAME/$USER # t=/home/$USER/etc/home/$HOSTNAME/$USER [[ -d $t ]] && HOME=$t && export HOME # file://~/.profile : ok:console+login+bash # file://~/.login : ko:console+login+bash # file://~/.xsession : on [[Debian]] # file://~/.xinitrc : # t=env-chhome.sh # [[ -f $t ]] && source $t # echo "- file://~/env-chhome.sh" === Joke === echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc ===== MISC ===== * http://rzr.online.fr/isbn/2841772772 # [[Livre]] : http://www.amazon.fr/exec/obidos/ASIN/2841772772/rzr-21/# * http://directory.fsf.org/text/editors/lesspipe.sh.html * http://arstechnica.com/guides/other/msh.ars/2 * http://linuxgazette.net/133/cherian.html # Bash * http://www.linuxjournal.com/article/6158 * http://chris-lamb.co.uk/2008/01/24/can-you-get-cp-to-give-a-progress-bar-like-wget/ * http://zsh.sourceforge.net/FAQ/zshfaq03.html# 3.24: What's wrong with cut and paste on my xterm? * http://www.ibm.com/developerworks/aix/library/au-badunixhabits.html # AwK vs GreP * https://github.com/pbrisbin/scripts# ScripT * http://www.unixmen.com/10-great-and-powerful-linux-commands-you-may-need-to-know/ * http://felixcrux.com/blog/syntax-highlighting-cat# [[ZSh]] * http://datavu.blogspot.fr/2014/08/useful-unix-commands-for-exploring-data.html ===== TEXT ===== Here is the way to reverse "od" output : echo "test" | od -A x -t x1 | sed -e 's|^[0-f]* ?||g' | xxd -r test * http://stackoverflow.com/questions/794902/whats-the-opposite-of-od1/25100021#25100021 ===== DATA FLOW ===== while read -n 1 byte ; do printf "%b" "$byte" ; done < "$input" > "$output" # BiN : * http://unix.stackexchange.com/questions/10801/how-to-use-bash-script-to-read-binary-file-content * https://stackoverflow.com/questions/314675/how-to-redirect-output-of-an-entire-shell-script-within-the-script-itself# ===== LINKS ===== * https://github.com/BYVoid/Batsh# BaT BasH CompileR * http://ohmyz.sh/# ZsH * http://code.joejag.com/2014/why-zsh.html# ZsH * http://linuxfr.org/news/liquid-prompt-1-9# PrompT * http://www.shellcheck.net/about.html# AnalysiS * https://github.com/shellinabox/shellinabox# WeB * https://news.ycombinator.com/item?id=18898523# AliaS * https://github.com/zerobyte-id/SEcraper# SearcH * https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1# PowerShell * https://mhoffman.github.io/2015/05/21/how-to-navigate-directories-with-the-shell.html# ToDo * https://github.com/Nukesor/pueue# QueuE ToDo TesT * https://tratt.net/laurie/blog/2024/faster_shell_startup_with_shell_switching.html# * https://learnbyexample.github.io/awk-idioms-explained/# AwK * https://learnbyexample.github.io/learn_gnused/breere-regular-expressions.html# SeD ===== MorE ===== @TaG : [[RegEx]] [[Perl]] [[DOS]] [[Unix]] [[AWK]] [[sed]] [[awk]] [[bash]] [[javascript]] [[script]] PrograM ScripT {{http://www.helmsmusic.com/images/aug13_hell_station.jpg}}