xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

Linux shell set command All In One

Linux shell set command All In One

image

erros ❌

unbound-variable

# $1: unbound variable
if (($1))
then
  echo $1
  # arg=$1
  # tsGenerator $arg
  # tsGenerator $1
  # tsGenerator
else
  echo "❌"
fi

#!/usr/bin/env bash

# 显示所有的已经执行的命令
# set -eux
# set -ex

# bug
set -u

echo "\$1 = $1"

echo "\$2 = $2"

# 一个参数
# $ /auto-ts-files-generator.sh 33

# 两个参数
# $ ./auto-ts-files-generator.sh 33 regular-expressions

It is well appreciated that when set -u is active Bash will report an error if an unbound variable is referenced, e.g.:

很好理解,当 set -u 处于活动状态时,如果引用未绑定变量,Bash 将报告错误,例如:

https://bnikolic.co.uk/blog/bash-unbound-variable

https://replit.com/@bnwebcode/bash-unbound-variable

https://unix.stackexchange.com/questions/463034/bash-throws-error-line-8-1-unbound-variable

: bad substitution

# : bad substitution ❌
if [ -n "${$2:-}" ]; then
  echo "\$2 = $2"
  filename=$2
else
  filename=$fallback
fi

solutions

set +u

-u Treats unset parameters as an error when substituting.
Using + rather than - causes these flags to be turned off.

https://blog.csdn.net/qq_21481459/article/details/104202174

demos

#!/usr/bin/env bash

# 显示所有的已经执行的命令
set -eux

# bug ❌ https://www.cnblogs.com/xgqfrms/p/17251644.html#5161214
# 当 set -u 处于活动状态时,如果引用了未绑定的变量,Bash 将报告错误
# set -u\
# ✅
set +u

echo "🚀 auto create templates in current folder..."

fallback="regular-expressions"

# filename=""
filename="regular-expressions"

# if (($2 != ''))
# $2: unbound variable ❌
if (($2))
then
  filename=$2
else
  filename=$fallback
fi

# : bad substitution ❌
# if [ -n "${$2:-}" ]; then
#   echo "\$2 = $2"
#   filename=$2
# else
#   filename=$fallback
# fi

#!/usr/bin/env bash

# 显示所有的已经执行的命令
set -eux

# bug ❌ https://www.cnblogs.com/xgqfrms/p/17251644.html#5161214
# 当 set -u 处于活动状态时,如果引用了未绑定的变量,Bash 将报告错误
# set -u
set +u

echo "🚀 auto create templates in current folder..."

fallback="regular-expressions"

# filename=""
filename="regular-expressions"

# if (($2 != ''))
# $2: unbound variable ❌
if (($2))
then
  echo "\$2 = $2"
  filename=$2
else
  filename=$fallback
fi

# : bad substitution ❌
# if [ -n "${$2:-}" ]; then
#   echo "\$2 = $2"
#   filename=$2
# else
#   filename=$fallback
# fi



# ✅ single quotes string
TS_TEMPLATE='
"use strict";

/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 * @created 2023-03-23
 * @modified
 *
 * @description
 * @description
 * @difficulty Easy
 * @ime_complexity O(n)
 * @space_complexity O(n)
 * @augments
 * @example
 * @link https://www.freecodecamp.org/chinese/learn/javascript-algorithms-and-data-structures/'$filename'/
 * @link https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/'$filename'/
 * @solutions
 *
 * @best_solutions
 *
 */

export { };

const log = console.log;

'

# tsGenerator: command not found ❌ function 必须先定义,然后再使用
function tsGenerator() {
  # function scope $1, 必须在调用函数的时候传递进来
  index=1
  while(( $index <= $1 ))
  do
    echo 👻 index = $index
    name=""
    if (( $index < 10 ))
    then
      name="0$index.ts"
    elif (( $index >= 10 ))
    then
      name="$index.ts"
    else
      echo "❌"
    fi
    echo -e filename = $name
    # printf "$TS_TEMPLATE"
    printf "$TS_TEMPLATE" > $name
    let "index++"
  done
  return 0
}

# scipt scope $1 ✅
if (($1))
then
  echo "🎮 arg = $1"
  tsGenerator $1
else
  echo "❌"
fi

# 一个参数
# $ /auto-ts-files-generator.sh 33
# 两个参数
# $ ./auto-ts-files-generator.sh 33 regular-expressions


FreeBSD

https://www.freebsd.org/

https://man.freebsd.org/cgi/man.cgi?query=set&apropos=0&sektion=0&manpath=FreeBSD+13.1-RELEASE+and+Ports&arch=default&format=html

man set

$ man set

BUILTIN(1)                     General Commands Manual                    BUILTIN(1)

NAME
     builtin, !, %, ., :, @, [, {, }, alias, alloc, bg, bind, bindkey, break,
     breaksw, builtins, case, cd, chdir, command, complete, continue, default, dirs,
     do, done, echo, echotc, elif, else, end, endif, endsw, esac, eval, exec, exit,
     export, false, fc, fg, filetest, fi, for, foreach, getopts, glob, goto, hash,
     hashstat, history, hup, if, jobid, jobs, kill, limit, local, log, login,
     logout, ls-F, nice, nohup, notify, onintr, popd, printenv, printf, pushd, pwd,
     read, readonly, rehash, repeat, return, sched, set, setenv, settc, setty,
     setvar, shift, source, stop, suspend, switch, telltc, test, then, time, times,
     trap, true, type, ulimit, umask, unalias, uncomplete, unhash, unlimit, unset,
     unsetenv, until, wait, where, which, while – shell built-in commands

SYNOPSIS
     See the built-in command description in the appropriate shell manual page.

DESCRIPTION
     Shell builtin commands are commands that can be executed within the running
     shell's process.  Note that, in the case of csh(1) builtin commands, the
     command is executed in a subshell if it occurs as any component of a pipeline
     except the last.

     If a command specified to the shell contains a slash ‘/’, the shell will not
     execute a builtin command, even if the last component of the specified command
     matches the name of a builtin command.  Thus, while specifying “echo” causes a
     builtin command to be executed under shells that support the echo builtin
     command, specifying “/bin/echo” or “./echo” does not.

     While some builtin commands may exist in more than one shell, their operation
     may be different under each shell which supports them.  Below is a table which
     lists shell builtin commands, the standard shells that support them and whether
     they exist as standalone utilities.

     Only builtin commands for the csh(1) and sh(1) shells are listed here.  Consult
     a shell's manual page for details on the operation of its builtin commands.
     Beware that the sh(1) manual page, at least, calls some of these commands
     “built-in commands” and some of them “reserved words”.  Users of other shells
     may need to consult an info(1) page or other sources of documentation.

     Commands marked “No**” under External do exist externally, but are implemented
     as scripts using a builtin command of the same name.

           Command           External        csh(1)       sh(1)
           !                 No              No           Yes
           %                 No              Yes          No
           .                 No              No           Yes
           :                 No              Yes          Yes
           @                 No              Yes          Yes
           [                 Yes             No           Yes
           {                 No              No           Yes
           }                 No              No           Yes
           alias             No**            Yes          Yes
           alloc             No              Yes          No
           bg                No**            Yes          Yes
           bind              No              No           Yes
           bindkey           No              Yes          No
           break             No              Yes          Yes
           breaksw           No              Yes          No
           builtin           No              No           Yes
           builtins          No              Yes          No
           case              No              Yes          Yes
           cd                No**            Yes          Yes
           chdir             No              Yes          Yes
           command           No**            No           Yes
           complete          No              Yes          No
           continue          No              Yes          Yes
           default           No              Yes          No
           dirs              No              Yes          No
           do                No              No           Yes
           done              No              No           Yes
           echo              Yes             Yes          Yes
           echotc            No              Yes          No
           elif              No              No           Yes
           else              No              Yes          Yes
           end               No              Yes          No
           endif             No              Yes          No
           endsw             No              Yes          No
           esac              No              No           Yes
           eval              No              Yes          Yes
           exec              No              Yes          Yes
           exit              No              Yes          Yes
           export            No              No           Yes
           false             Yes             No           Yes
           fc                No**            No           Yes
           fg                No**            Yes          Yes
           filetest          No              Yes          No
           fi                No              No           Yes
           for               No              No           Yes
           foreach           No              Yes          No
           getopts           No**            No           Yes
           glob              No              Yes          No
           goto              No              Yes          No
           hash              No**            No           Yes
           hashstat          No              Yes          No
           history           No              Yes          No
           hup               No              Yes          No
           if                No              Yes          Yes
           jobid             No              No           Yes
           jobs              No**            Yes          Yes
           kill              Yes             Yes          Yes
           limit             No              Yes          No
           local             No              No           Yes
           log               No              Yes          No
           login             Yes             Yes          No
           logout            No              Yes          No
           ls-F              No              Yes          No
           nice              Yes             Yes          No
           nohup             Yes             Yes          No
           notify            No              Yes          No
           onintr            No              Yes          No
           popd              No              Yes          No
           printenv          Yes             Yes          No
           printf            Yes             No           Yes
           pushd             No              Yes          No
           pwd               Yes             No           Yes
           read              No**            No           Yes
           readonly          No              No           Yes
           rehash            No              Yes          No
           repeat            No              Yes          No
           return            No              No           Yes
           sched             No              Yes          No
           set               No              Yes          Yes
           setenv            No              Yes          No
           settc             No              Yes          No
           setty             No              Yes          No
           setvar            No              No           Yes
           shift             No              Yes          Yes
           source            No              Yes          No
           stop              No              Yes          No
           suspend           No              Yes          No
           switch            No              Yes          No
           telltc            No              Yes          No
           test              Yes             No           Yes
           then              No              No           Yes
           time              Yes             Yes          No
           times             No              No           Yes
           trap              No              No           Yes
           true              Yes             No           Yes
           type              No**            No           Yes
           ulimit            No**            No           Yes
           umask             No**            Yes          Yes
           unalias           No**            Yes          Yes
           uncomplete        No              Yes          No
           unhash            No              Yes          No
           unlimit           No              Yes          No
           unset             No              Yes          Yes
           unsetenv          No              Yes          No
           until             No              No           Yes
           wait              No**            Yes          Yes
           where             No              Yes          No
           which             Yes             Yes          No
           while             No              Yes          Yes

SEE ALSO
     csh(1), dash(1), echo(1), false(1), info(1), kill(1), login(1), nice(1),
     nohup(1), printenv(1), printf(1), pwd(1), sh(1), test(1), time(1), true(1),
     which(1), zsh(1)

HISTORY
     The builtin manual page first appeared in FreeBSD 3.4.

AUTHORS
     This manual page was written by Sheldon Hearn <sheldonh@FreeBSD.org>.

macOS 13.1                        December 21, 2010                       macOS 13.1


set & unset

       set [ {+|-}options | {+|-}o [ option_name ] ] ... [ {+|-}A [ name ] ]
           [ arg ... ]
              Set the options for the shell and/or set the positional
              parameters, or declare and set an array.  If the -s option is
              given, it causes the specified arguments to be sorted before
              assigning them to the positional parameters (or to the array
              name if -A is used).  With +s sort arguments in descending
              order.  For the meaning of the other flags, see zshoptions(1).
              Flags may be specified by name using the -o option. If no option
              name is supplied with -o, the current option states are printed:
              see the description of setopt below for more information on the
              format.  With +o they are printed in a form that can be used as
              input to the shell.

              If the -A flag is specified, name is set to an array containing
              the given args; if no name is specified, all arrays are printed
              together with their values.

              If +A is used and name is an array, the given arguments will
              replace the initial elements of that array; if no name is
              specified, all arrays are printed without their values.

              The behaviour of arguments after -A name or +A name depends on
              whether the option KSH_ARRAYS is set.  If it is not set, all
              arguments following name are treated as values for the array,
              regardless of their form.  If the option is set, normal option
              processing continues at that point; only regular arguments are
              treated as values for the array.  This means that

                     set -A array -x -- foo

              sets array to `-x -- foo' if KSH_ARRAYS is not set, but sets the
              array to foo and turns on the option `-x' if it is set.

              If the -A flag is not present, but there are arguments beyond
              the options, the positional parameters are set.  If the option
              list (if any) is terminated by `--', and there are no further
              arguments, the positional parameters will be unset.

              If no arguments and no `--' are given, then the names and values
              of all parameters are printed on the standard output.  If the
              only argument is `+', the names of all parameters are printed.

              For historical reasons, `set -' is treated as `set +xv' and `set
              - args' as `set +xv -- args' when in any other emulation mode
              than zsh's native mode.


$ man zshbuiltins
# $ man zshbuiltins | grep set

# Unknown locale, assuming C
$ locale
LANG=""
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

# fix
$ export LANG="en_US.UTF-8"
$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

https://stackoverflow.com/questions/77058657/why-both-the-set-and-unset-commands-dont-work-as-expected-in-my-macos-terminal#comment135847407_77058657

https://pubs.opengroup.org/onlinepubs/007904875/utilities/set.html

       unset [ -fmv ] name ...
              Each named parameter is unset.  Local parameters remain local
              even if unset; they appear unset within scope, but the previous
              value will still reappear when the scope ends.

              Individual elements of associative array parameters may be unset
              by using subscript syntax on name, which should be quoted (or
              the entire command prefixed with noglob) to protect the
              subscript from filename generation.

              If the -m flag is specified the arguments are taken as patterns
              (should be quoted) and all parameters with matching names are
              unset.  Note that this cannot be used when unsetting associative
              array elements, as the subscript will be treated as part of the
              pattern.

              The -v flag specifies that name refers to parameters. This is
              the default behaviour.

              unset -f is equivalent to unfunction.

https://pubs.opengroup.org/onlinepubs/007904875/utilities/unset.html

refs

https://www.cnblogs.com/xgqfrms/p/17251644.html#5161214



©xgqfrms 2012-2021

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!


posted @ 2023-03-25 05:38  xgqfrms  阅读(60)  评论(1编辑  收藏  举报