I want my crouch to stay crouched while my crouch key is held down, but when it is released i want it to go back to standing. Anyone know how to do this with my code?

public bool CanMove { get; private set; } = true;
private bool IsSprinting => canSprint && Input.GetKey(sprintKey);
private bool ShouldJump => Input.GetKeyDown(JumpKey) && characterController.isGrounded;
private bool ShouldCrouch => Input.GetKeyDown(crouchKey) && !duringCrouchAnimation && characterController.isGrounded;

[Header("Funcional Options")]
[SerializeField] private bool canSprint = true;
[SerializeField] private bool canJump = true;
[SerializeField] private bool canCrouch = true;
[SerializeField] private bool canUseHeadbob = true;

[Header("Controls")]
[SerializeField] private KeyCode sprintKey = KeyCode.LeftShift;
[SerializeField] private KeyCode JumpKey = KeyCode.Space;
[SerializeField] private KeyCode crouchKey = KeyCode.LeftControl;

[Header("Movement Parameters")]
[SerializeField] private float walkSpeed = 3.0f;
[SerializeField] private float sprintSpeed = 6.0f;
[SerializeField] private float crouchSpeed = 1.5f;

[Header("Look Parameters")]
[SerializeField, Range(1, 10)] private float lookSpeedX = 2.0f;
[SerializeField, Range(1, 10)] private float lookSpeedY = 2.0f;
[SerializeField, Range(1, 180)] private float upperLookLimit = 80.0f;
[SerializeField, Range(1, 180)] private float lowerLookLimit = 80.0f;

[Header("Jumping Parameters")]
[SerializeField] private float jumpForce = 8.0f;
[SerializeField] private float gravity = 30.0f;

[Header("Crouch Parameters")]
[SerializeField] private float crouchHeight = 0.5f;
[SerializeField] private float standingHeight = 2f;
[SerializeField] private float timeToCrouch = 0.25f;
[SerializeField] private Vector3 crouchingCenter = new Vector3(0,0.5f,0);
[SerializeField] private Vector3 standingCenter = new Vector3(0, 0, 0);
private bool isCrouching;
private bool duringCrouchAnimation;

[Header("Headbob Parameters")]
[SerializeField] private float walkBobSpeed = 14f;
[SerializeField] private float walkBobAmount = 0.05f;
[SerializeField] private float sprintBobSpeed = 18f;
[SerializeField] private float sprintBobAmount = 0.1f;
[SerializeField] private float crouchBobSpeed = 8f;
[SerializeField] private float crouchBobAmount = 0.025f;
private float defaultYPos = 0;
private float timer;

private Camera playerCamera;
private CharacterController characterController;

private Vector3 moveDirection;
private Vector2 currentInput;

private float rotationX = 0;

void Awake()
{
    playerCamera = GetComponentInChildren<Camera>();
    characterController = GetComponent<CharacterController>();
    defaultYPos = playerCamera.transform.localPosition.y;
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.visible = false;
}

void Update()
{
    if (CanMove)
    {
        HandleMovementInput();
        HandleMouseLook();

        if (canJump)
            HandleJump();

        if (canCrouch)
            handleCrouch();

        if (canUseHeadbob)
            HandleHeadbob();

        ApplyFinalMovements();
    }
}

private void HandleMovementInput()
{
    currentInput = new Vector2((isCrouching ? crouchSpeed : IsSprinting ? sprintSpeed : walkSpeed) * Input.GetAxis("Vertical"), (isCrouching ? crouchSpeed : IsSprinting ? sprintSpeed : walkSpeed) * Input.GetAxis("Horizontal"));

    float moveDirectionY = moveDirection.y;
    moveDirection = (transform.TransformDirection(Vector3.forward) * currentInput.x) + (transform.TransformDirection(Vector3.right) * currentInput.y);
    moveDirection.y = moveDirectionY;
}

private void HandleMouseLook()
{
    rotationX -= Input.GetAxis("Mouse Y") * lookSpeedY;
    rotationX = Mathf.Clamp(rotationX, -upperLookLimit, lowerLookLimit);
    playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
    transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeedX, 0);
}

private void HandleJump()
{
    if (ShouldJump)
        moveDirection.y = jumpForce;
}

private void handleCrouch()
{
    if (ShouldCrouch)
        StartCoroutine(CrouchStand());
}

private void HandleHeadbob()
{
    if (!characterController.isGrounded) return;

    if(Mathf.Abs(moveDirection.x) > 0.1f || Mathf.Abs(moveDirection.z) > 0.1f)
    {
        timer += Time.deltaTime * (isCrouching ? crouchBobSpeed : IsSprinting ? sprintBobSpeed : walkBobSpeed);
        playerCamera.transform.localPosition = new Vector3(
            playerCamera.transform.localPosition.x,
            defaultYPos + Mathf.Sin(timer) * (isCrouching ? crouchBobAmount : IsSprinting ? sprintBobAmount : walkBobAmount),
            playerCamera.transform.localPosition.z);
    }
}

private void ApplyFinalMovements()
{
    if (!characterController.isGrounded)
        moveDirection.y -= gravity * Time.deltaTime;

    characterController.Move(moveDirection * Time.deltaTime); 
}

private IEnumerator CrouchStand()
{
    if (isCrouching && Physics.Raycast(playerCamera.transform.position, Vector3.up, 1f))
        yield break;

    duringCrouchAnimation = true;

    float timeElapsed = 0;
    float targetHeight = isCrouching ? standingHeight : crouchHeight;
    float currentHeight = characterController.height;
    Vector3 targetCenter = isCrouching ? standingCenter : crouchingCenter;
    Vector3 currentCenter = characterController.center;

    while(timeElapsed < timeToCrouch)
    {
        characterController.height = Mathf.Lerp(currentHeight, targetHeight, timeElapsed / timeToCrouch);
        characterController.center = Vector3.Lerp(currentCenter, targetCenter, timeElapsed / timeToCrouch);
        timeElapsed += Time.deltaTime;
        yield return null;
    }

    characterController.height = targetHeight;
    characterController.center = targetCenter;

    isCrouching = !isCrouching;

    duringCrouchAnimation = false;
}

if the problem persists, declare a new bool
ShouldStand, ShouldCrouch - relatively GetKeyUp, GetKeyDown

you have to code the rest

private void HandleCrouch()
 {
    if (ShouldCrouch)
     StartCoroutine(Crouching());
 if (ShouldStand)
     StartCoroutine(Standing());
 }

FinalResult:

private bool ShouldCrouch => Input.GetKeyDown(crouchKey) && !duringCrouchAnimation && characterController.isGrounded;
private bool ShouldStand=> Input.GetKeyUp(crouchKey) && !duringCrouchAnimation && characterController.isGrounded; 

private void HandleCrouch()
 {
     if (ShouldCrouch)
 {
     StartCoroutine(Crouching());
 isCrouching = !isCrouching;
 }
 if (ShouldStand)
 {
     StartCoroutine(Standing());
 isCrouching = !isCrouching;
 }
 }

 private IEnumerator Crouching()
 {
     if (isCrouching && Physics.Raycast(playerCamera.transform.position, Vector3.up, 1f))
         yield break;

     duringCrouchAnimation = true;
     float timeElapsed = 0;
     float targetHeight = standingHeight
     float currentHeight = characterController.height;
     Vector3 targetCenter = standingCenter
     Vector3 currentCenter = characterController.center;
     while(timeElapsed < timeToCrouch)
     {
         characterController.height = Mathf.Lerp(currentHeight, targetHeight, timeElapsed / timeToCrouch);
         characterController.center = Vector3.Lerp(currentCenter, targetCenter, timeElapsed / timeToCrouch);
         timeElapsed += Time.deltaTime;
         yield return null;
     }
     characterController.height = targetHeight;
     characterController.center = targetCenter;

     duringCrouchAnimation = false;
 }

 private IEnumerator Standing()
 {
     if (isCrouching && Physics.Raycast(playerCamera.transform.position, Vector3.up, 1f))
         yield break;

     duringCrouchAnimation = true;
     float timeElapsed = 0;
     float targetHeight = crouchHeight;
     float currentHeight = characterController.height;
     Vector3 targetCenter = crouchingCenter;
     Vector3 currentCenter = characterController.center;
     while(timeElapsed < timeToCrouch)
     {
         characterController.height = Mathf.Lerp(currentHeight, targetHeight, timeElapsed / timeToCrouch);
         characterController.center = Vector3.Lerp(currentCenter, targetCenter, timeElapsed / timeToCrouch);
         timeElapsed += Time.deltaTime;
         yield return null;
     }
     characterController.height = targetHeight;
     characterController.center = targetCenter;

     duringCrouchAnimation = false;
 }