===== 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}}