$ s='pic.me.jpg' $ echo $s pic.me.jpg $ echo ${s%.jpg} pic.me $ echo ${s%.*} pic.me $ echo ${s%%.*} pic $ echo ${s#pic.} me.jpg $ echo ${s##*.} jpg $ echo $s pic.me.jpg $ echo ${s:4:2} me $ cd tmp $ ls file1 file2 file3 file4 script.sh $ rm * $ touch pic{1,2,3,4,5}.jpg $ ls pic1.jpg pic2.jpg pic3.jpg pic4.jpg pic5.jpg $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ for i in *.jpg > do > cp $i $i.bak > done $ ls pic1.jpg pic2.jpg pic3.jpg pic4.jpg pic5.jpg pic1.jpg.bak pic2.jpg.bak pic3.jpg.bak pic4.jpg.bak pic5.jpg.bak $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:35 pic1.jpg.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:35 pic2.jpg.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:35 pic3.jpg.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:35 pic4.jpg.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:35 pic5.jpg.bak $ rm *.bak $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ cp pic1.jpg pic1.bak $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:38 pic1.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ rm pic1.bak $ cp -p pic1.jpg pic1.bak $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ cd .. $ ls line30.sh line30.sh $ more line30.sh #!/bin/bash line="" while true do read -p "Next word: " word line="$line $word" if [[ ${#line} -gt 30 ]] then break fi done echo ${#line}:$line exit 0 set mark: ...skipping... #!/bin/bash line="" while true do read -p "Next word: " word line="$line $word" if [[ ${#line} -gt 30 ]] then break fi done echo ${#line}:$line exit 0 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ $ bash line30.sh Next word: This Next word: is Next word: Tuesday Next word: afternoon Next word: at Next word: 2:46pm 36: This is Tuesday afternoon at 2:46pm $ cd tmp $ ls pic1.bak pic2.jpg pic4.jpg pic1.jpg pic3.jpg pic5.jpg $ ls -l total 0 -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic1.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ ls pic1.* pic1.bak pic1.jpg $ ls pic?.jpg pic1.jpg pic2.jpg pic3.jpg pic4.jpg pic5.jpg $ touch pic2.bak $ ls pic1.bak pic2.bak pic3.jpg pic5.jpg pic1.jpg pic2.jpg pic4.jpg $ touch pic1.jpeg $ $ ls -l pic[^1].* -rw-r--r-- 1 sandiway staff 0 Sep 22 14:56 pic2.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic3.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ ls -l pic[^13].* -rw-r--r-- 1 sandiway staff 0 Sep 22 14:56 pic2.bak -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic2.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic4.jpg -rw-r--r-- 1 sandiway staff 0 Sep 22 14:32 pic5.jpg $ cd .. $ pwd /Users/sandiway/courses/508/ling508-26 $ ls -l rmext.sh -rwxr--r--@ 1 sandiway staff 192 Sep 17 2025 rmext.sh $ more rmext.sh #!/bin/bash if [[ $# -ne 2 ]] then echo "usage: ext1 ext2" exit 1 fi for filename in *.$1 # Traverse list of files ending with 1st argument. do mv "$filename" "${filename%$1}$2" done exit 0 $ cd tmp $ ls pic1.bak pic1.jpg pic2.jpg pic4.jpg pic1.jpeg pic2.bak pic3.jpg pic5.jpg $ ../rmext.sh jpg JPG $ ls pic1.bak pic1.JPG pic2.JPG pic4.JPG pic1.jpeg pic2.bak pic3.JPG pic5.JPG $ $ ../rmext.sh usage: ext1 ext2 $ $