{"id":242,"date":"2026-10-13T01:21:39","date_gmt":"2026-10-13T01:21:39","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/04\/16\/interview-questions-answer-sets-shell-programming\/"},"modified":"2026-10-13T01:21:39","modified_gmt":"2026-10-13T01:21:39","slug":"interview-questions-answer-sets-shell-programming","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/interview-questions-answer-sets-shell-programming\/","title":{"rendered":"Shell and Bash Interview Questions: Practical Answers, Commands, and Script Patterns"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-04-16; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide converts a legacy shell interview question list into a structured Bash reference for DevOps engineers. It covers essential commands, process control, conditionals and loops, text processing, and safer scripting practices you can use in both interviews and real operations work.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/04\/shell-programming-interview.png\" alt=\"Shell programming interview questions\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Core shell commands interviewers ask first<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are foundational commands that appear frequently in shell interviews. Knowing both the command and its practical context matters more than memorizing one-liners.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Interview prompt<\/th><th>Command<\/th><th>What it does<\/th><\/tr><\/thead><tbody><tr><td>Find your current shell<\/td><td><code>echo $SHELL<\/code><\/td><td>Prints your login shell path<\/td><\/tr><tr><td>Show current date\/time<\/td><td><code>date<\/code><\/td><td>Displays system date and time<\/td><\/tr><tr><td>List logged-in users<\/td><td><code>who<\/code><\/td><td>Shows active logins<\/td><\/tr><tr><td>Show current directory<\/td><td><code>pwd<\/code><\/td><td>Prints working directory<\/td><\/tr><tr><td>Show current username<\/td><td><code>whoami<\/code><\/td><td>Prints effective user<\/td><\/tr><tr><td>Count lines\/words\/bytes<\/td><td><code>wc file.txt<\/code><\/td><td>Basic file metrics<\/td><\/tr><tr><td>Search text in file<\/td><td><code>grep \"text\" file.txt<\/code><\/td><td>Matches lines containing text<\/td><\/tr><tr><td>Search recursively in directory<\/td><td><code>grep -R \"text\" \/path<\/code><\/td><td>Recursive search across files<\/td><\/tr><tr><td>Delete a file<\/td><td><code>rm file.txt<\/code><\/td><td>Removes a file<\/td><\/tr><tr><td>Delete recursively<\/td><td><code>rm -rf \/path<\/code><\/td><td>Force-removes directory tree (dangerous)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$SHELL\"<\/span>\ndate\nwho\npwd\nwhoami\nwc app.log\ngrep <span class=\"hljs-string\">\"ERROR\"<\/span> app.log\ngrep -R <span class=\"hljs-string\">\"ERROR\"<\/span> \/<span class=\"hljs-keyword\">var<\/span>\/log\/myapp<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Process and job control essentials<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Process control questions often test whether you understand <strong>inspection first, termination second<\/strong>. Interviewers usually expect safe handling of PIDs and exit status checks.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Task<\/th><th>Command<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>List running processes<\/td><td><code>ps<\/code> or <code>ps -ef<\/code><\/td><td>Output format depends on platform\/options<\/td><\/tr><tr><td>Find process by pattern<\/td><td><code>pgrep -f name<\/code><\/td><td>Useful before kill<\/td><\/tr><tr><td>Terminate gracefully<\/td><td><code>kill -TERM PID<\/code><\/td><td>Preferred first signal<\/td><\/tr><tr><td>Force terminate<\/td><td><code>kill -KILL PID<\/code><\/td><td>Use only when graceful stop fails<\/td><\/tr><tr><td>Run in background<\/td><td><code>command &amp;<\/code><\/td><td>Starts job asynchronously<\/td><\/tr><tr><td>Current shell PID<\/td><td><code>echo $$<\/code><\/td><td>PID of current shell process<\/td><\/tr><tr><td>Last background PID<\/td><td><code>echo $!<\/code><\/td><td>PID of most recent background job<\/td><\/tr><tr><td>Last command status<\/td><td><code>echo $?<\/code><\/td><td><code>0<\/code> usually indicates success<\/td><\/tr><tr><td>Signal process group<\/td><td><code>kill 0<\/code><\/td><td>Can affect multiple processes in current process group<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">pid=<span class=\"hljs-string\">\"$(pgrep -f my-service)\"<\/span>\n<span class=\"hljs-keyword\">if<\/span> &#91; -n <span class=\"hljs-string\">\"$pid\"<\/span> ]; then\n  kill -TERM <span class=\"hljs-string\">\"$pid\"<\/span>\n  sleep <span class=\"hljs-number\">2<\/span>\n  ps -p <span class=\"hljs-string\">\"$pid\"<\/span>\nfi<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Special shell parameters you should remember<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parameter<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>$0<\/code><\/td><td>Script name<\/td><\/tr><tr><td><code>$1<\/code>, <code>$2<\/code>&#8230;<\/td><td>Positional arguments<\/td><\/tr><tr><td><code>$#<\/code><\/td><td>Number of positional arguments<\/td><\/tr><tr><td><code>$*<\/code><\/td><td>All positional args (single word context)<\/td><\/tr><tr><td><code>$@<\/code><\/td><td>All positional args (preserves argument boundaries when quoted)<\/td><\/tr><tr><td><code>$?<\/code><\/td><td>Exit status of last command<\/td><\/tr><tr><td><code>$$<\/code><\/td><td>Current shell PID<\/td><\/tr><tr><td><code>$!<\/code><\/td><td>PID of last background command<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conditionals, tests, and loops in Bash<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Interviewers commonly ask for basic control flow syntax and test operators. Be ready to combine numeric, string, and file checks cleanly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">if\/elif with numeric, string, and file tests<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">count=<span class=\"hljs-number\">12<\/span>\nfile=<span class=\"hljs-string\">\"\/tmp\/report.txt\"<\/span>\n\n<span class=\"hljs-keyword\">if<\/span> &#91; <span class=\"hljs-string\">\"$count\"<\/span> -gt <span class=\"hljs-number\">10<\/span> ] &amp;&amp; &#91; -f <span class=\"hljs-string\">\"$file\"<\/span> ]; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Large run and report exists\"<\/span>\nelif &#91; -z <span class=\"hljs-string\">\"$file\"<\/span> ]; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"No report file specified\"<\/span>\n<span class=\"hljs-keyword\">else<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Conditions not met\"<\/span>\nfi<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">for, while, and case patterns<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-keyword\">for<\/span> env in dev stage prod; <span class=\"hljs-keyword\">do<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Deploying to $env\"<\/span>\ndone\n\ni=<span class=\"hljs-number\">1<\/span>\n<span class=\"hljs-keyword\">while<\/span> &#91; <span class=\"hljs-string\">\"$i\"<\/span> -le <span class=\"hljs-number\">3<\/span> ]; <span class=\"hljs-keyword\">do<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Attempt $i\"<\/span>\n  i=$((i + <span class=\"hljs-number\">1<\/span>))\ndone\n\nread -r action\n<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">\"$action\"<\/span> in\n  status) ps -ef ;;\n  users) who ;;\n  now) date ;;\n  *) <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Invalid option\"<\/span> ;;\nesac<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Text processing one-liners frequently asked in interviews<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Task<\/th><th>Command<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>List only empty lines<\/td><td><code>grep '^$' file.txt<\/code><\/td><td>Matches blank lines<\/td><\/tr><tr><td>Remove blank lines<\/td><td><code>grep -v '^$' file.txt<\/code> or <code>sed '\/^$\/d' file.txt<\/code><\/td><td>Two common approaches<\/td><\/tr><tr><td>Extract character positions 10-20<\/td><td><code>cut -c 10-20 file.txt<\/code><\/td><td>Character-based slicing<\/td><\/tr><tr><td>Print line 25<\/td><td><code>sed -n '25p' file.txt<\/code><\/td><td>Direct and compact<\/td><\/tr><tr><td>Replace <code>n<\/code> with <code>xyz<\/code><\/td><td><code>sed 's\/n\/xyz\/g' file.txt<\/code><\/td><td>Global replacement per line<\/td><\/tr><tr><td>List users from passwd file<\/td><td><code>cut -d: -f1 \/etc\/passwd<\/code><\/td><td>Username field extraction<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">grep <span class=\"hljs-string\">'^$'<\/span> file.txt\ngrep -v <span class=\"hljs-string\">'^$'<\/span> file.txt &gt; no_blanks.txt\nsed <span class=\"hljs-string\">'\/^$\/d'<\/span> file.txt &gt; no_blanks_sed.txt\ncut -c <span class=\"hljs-number\">10<\/span><span class=\"hljs-number\">-20<\/span> file.txt\nsed -n <span class=\"hljs-string\">'25p'<\/span> file.txt\nsed <span class=\"hljs-string\">'s\/n\/xyz\/g'<\/span> file.txt &gt; new_file.txt<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Legacy reference preserved from the original post: <a href=\"http:\/\/www.scmgalaxy.com\/forum\/shell-script\/shell-script-to-read-file-line-by-line.html\">Shell script to read file line by line<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Parsing options with getopts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>getopts<\/code> is a standard way to parse short options like <code>-n 15 -x 20<\/code> in shell scripts.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nnum=<span class=\"hljs-string\">\"\"<\/span>\nxval=<span class=\"hljs-string\">\"\"<\/span>\n\n<span class=\"hljs-keyword\">while<\/span> getopts <span class=\"hljs-string\">\"n:x:\"<\/span> opt; <span class=\"hljs-keyword\">do<\/span>\n  <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">\"$opt\"<\/span> in\n    n) num=<span class=\"hljs-string\">\"$OPTARG\"<\/span> ;;\n    x) xval=<span class=\"hljs-string\">\"$OPTARG\"<\/span> ;;\n    *) <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Usage: $0 -n number -x value\"<\/span>; <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">1<\/span> ;;\n  esac\ndone\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"n=$num x=$xval\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Quick conceptual answers from common shell interviews<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>What is a named pipe?<\/strong> A FIFO special file used for inter-process communication.<\/li><li><strong>What does <code>cmd1 &amp;&amp; cmd2<\/code> mean?<\/strong> Run <code>cmd2<\/code> only if <code>cmd1<\/code> succeeds.<\/li><li><strong>What does <code>cmd1 || cmd2<\/code> mean?<\/strong> Run <code>cmd2<\/code> only if <code>cmd1<\/code> fails.<\/li><li><strong>Exported vs non-exported variable:<\/strong> Exported variables are inherited by child processes; non-exported variables remain in the current shell.<\/li><li><strong>Open a read-only file in vi:<\/strong> <code>vi -R filename<\/code>.<\/li><li><strong>Schedule a 4:00 AM daily job:<\/strong> use a cron entry.<\/li><\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">crontab -e\n<span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">4<\/span> * * * <span class=\"hljs-regexp\">\/usr\/<\/span>local\/bin\/backup.sh\n\ntar -zxvf archive.tar.gz\nuname -m\nfind . -type f -perm <span class=\"hljs-number\">0655<\/span> -exec chmod <span class=\"hljs-number\">0755<\/span> {} \\;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Typical script execution workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run script with arguments] --> B[getopts parses options]\n    B --> C[Validate required inputs]\n    C --> D{Inputs valid}\n    D -- no --> E[Print usage and exit 1]\n    D -- yes --> F[Run main commands]\n    F --> G[Capture exit code]\n    G --> H{Exit code is 0}\n    H -- yes --> I[Report success]\n    H -- no --> J[Report failure and exit nonzero]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Prefer <strong>safe defaults<\/strong>: inspect with <code>ps<\/code>\/<code>pgrep<\/code> before using <code>kill<\/code>.<\/li><li>Use <strong>quoted variables<\/strong> in scripts to avoid word-splitting bugs.<\/li><li>Treat <code>rm -rf<\/code> and <code>kill -KILL<\/code> as last-resort operations.<\/li><li>Check exit codes (<code>$?<\/code>) and return nonzero status on failures.<\/li><li>Use <code>grep -R<\/code> or <code>find<\/code> deliberately instead of broad globs like <code>*<\/code> in large directories.<\/li><li>Remember that command options and output can vary across Linux\/Unix distributions and shells.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you can explain these commands and patterns clearly, you will handle most shell\/Bash interview rounds with confidence.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A modernized, DevOps-focused reference for common shell and Bash interview questions. Includes command comparisons, scripting patterns, and production-safe examples.<\/p>\n","protected":false},"author":1,"featured_media":4281,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[52],"tags":[767,766,3909,507,1553,3902,482,1830,3910,138,3903,3904,3908,3907,3906,3905,637],"class_list":["post-242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interview-questions-answers","tag-answer","tag-interview","tag-interview-questions-answer-for-shell-programming","tag-list","tag-most-asked","tag-programming","tag-questions","tag-selected","tag-sets","tag-shell","tag-shell-programming","tag-shell-programming-interview","tag-shell-programming-interview-guide","tag-shell-programming-interview-qa","tag-shell-programming-interview-questions-answer","tag-shell-programming-job-interview","tag-top"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions"}],"predecessor-version":[{"id":79069,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/242\/revisions\/79069"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4281"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}